本文将介绍如何使 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 地址