WatchKit 之 数据共享

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

2014-11-20 16:511870
  • XiangqiTu2014-11-20 16:58

    很不错。。。以后要入门直接参照Nono系列了:),真棒!~

  • xuyanming2014-11-20 22:30

    markmarkmarkmarkmark