Watch App 与 iOS App 之间进行数据共享

来源:互联网 发布:学会c语言能做什么 编辑:程序博客网 时间:2024/05/16 06:00
  • 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。

image

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)")}

运行效果:
image

文件

通过 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")}

运行效果:
image

demo地址:https://github.com/inonomori/WatchKitDataShareDemo

0 0
原创粉丝点击