您的位置:首页 > 其它

WatchKit 之 数据共享

2016-01-08 10:05 204 查看



App Group
NSUserDefault
文件

本文将介绍如何使 Watch App 与 iOS App 之间进行数据共享


App Group

App Group 是一个 App 与其扩展均可以访问的本地文件系统的一块区域。由于 Watch App 与 iOS App 是在不同的沙盒环境下运行,正常情况下他们彼此无法分享数据,因此,我们需要创建一个 App Group,使的它们拥有一个共享的文件区域。
点击项目,在 target 里分别打开项目本身和 Watch App 的 App Groups,点击加号,添加一个 App Group,输入一个唯一的标识符。我们之后会在 Watch App 和 iOS App 中通过该标识符访问同一个 App Group。




NSUserDefault

不同于平时使用 defaultUserDefault,在这里我们需要指定 app group,使得 Watch App 与 iOS App 可以分享用户设置。我们使用 initWithSuiteName: 方法,其参数就是 app group identifier

if let userDefault:NSUserDefaults = NSUserDefaults(suiteName: "group.watchShareData.container") {
let value = userDefault.integerForKey("shareInt")
self.labelValue.setText("\(value)")
}


运行效果:




文件

通过 NSFileManager 的 containerURLForSecurityApplicationGroupIdentifier 方法,获得一个共享 app group 的目录。在这个目录下的文件可以在 Watch App 与 iOS App 中读写访问。

在 iOS App 中,我们使用一个 imagePicker,点击图片后就将图片保存到该共享目录。

@IBAction func shareImageButtonTouched(sender: AnyObject) {
self.imagePicker = UIImagePickerController()
self.imagePicker.sourceType = .PhotoLibrary
self.imagePicker.delegate = self
self.presentViewController(self.imagePicker, animated: true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
if let dirURL = self.getShareDirURL() {
//将图片文件写入共享目录
UIImagePNGRepresentation(image).writeToURL(dirURL.URLByAppendingPathComponent("image.png"), atomically: true)
}
self.dismissViewControllerAnimated(true, completion: nil)
}

func getShareDirURL()->NSURL?{
//这里返回一个所属 App Group 的共享目录
return NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.watchShareData.container")
}


在 Watch App 中,我们从该目录读取图片,并且展示

override func willActivate() {
super.willActivate()

if let dirURL = self.getShareDirURL() {
if let imageData = NSData(contentsOfURL:dirURL.URLByAppendingPathComponent("image.png")) {
self.imageInterface.setImage(UIImage(data: imageData))
}
}
}

func getShareDirURL() -> NSURL? {
return NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.watchShareData.container")
}


运行效果:



本文 Demo 工程 github 地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: