Tiger的小站

得失从缘,心无增减

iOS 8 中 Extension 和 Containing App 之间的数据共享

扩展(Extension)是 iOS 8 和 OSX 10.10 中引入新功能,Extension 不会单独存在,它将做为 App 的附加功能出现,为 App 提供更好的交互体验。由此 Extension 和容器应用(Containing App)之间的数据共享在所难免。Apple 在它的官方文档中只是以 NSUserDefaults 举例做了介绍,然后丢了一句“ Use Core Data, SQLite, or Posix locks to help coordinate data access in a shared container.”就算完事儿了。下面就来介绍下具体如何操作。

Extension Target

喵神在WWDC 2014 Session笔记 – iOS 通知中心扩展制作入门已经有了非常详尽的介绍,总之你需要在项目中添加一个 Application Extension Target( File > New Target > Application Extension > …),然后就可以从你非常熟悉的 view controller 开始编写 widget 代码了。

App Groups

在默认情况下,Extension 是无法直接获取 Containing App 的数据的,但在 iOS 8 中我们可以通过开启 App Groups 以实现同一个 team 的 Apps 及其 Extension 之间的数据共享。开启 App Groups:

  • 在 Xcode 6 的 Targets 中选中主 App‘s Target,找到Capabilities标签
  • 找到App Groups选项并展开,然后戳一下添加按钮
  • 给你的 App Groups 起个名字,通常是 group.xxx的格式,随后 Xcode 自动创建.entitlements授权文件,其中包含了共享容器的访问名称,并将此 App Group 登记在你的开发者账号下的,确保只有你的 team 的 app 可以使用这些共享容器
  • 选中 Extension’s Target,重复以上操作,勾选刚才创建的 group 就可以了

现在你把原来存在 App 沙箱中的数据改存在 这个 group 中就可以实现数据的共享了,在具体举例之前,你可能发现仅有数据好像还不够,比如你使用了 CoreData,还需要选中 .xcdatamodeld文件和要用到的 model 文件,在 Xcode 的右侧工具栏中的找到Target Membership勾选 Extension 名,把它们加到 Extension Target 中。然后把 .xcdatamodeld文件加到 Extension 的 Resource Bundle 里面:

  • Targets 中选中 Extension‘s Target,找到Build Phase标签
  • 找到Copy Bundle Resources选项并展开,然后戳一下添加按钮
  • 添加相应的.xcdatamodel文件

数据共享

好了,一切准备就绪,把

[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];

换成

[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.xxx"] 

也就是让主 App 和 Extension 都去访问共享容器中的文件,从而实现数据的共享。现在“you can also use Core Data, or in some cases SQLite, to help coordinate data access in a shared container.”(捂嘴笑)

如果是 NSUserDefaults 就是把

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

换成

NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxx"];

参考

App Extension Programming Guide

Sharing Core Data between App and Extension in iOS 8

WWDC 2014 Session笔记 – iOS 通知中心扩展制作入门

iOS8 Day-by-Day– Day2 — 分享应用扩展

最后

对于开发者来说好像又是一场腥风血雨的挂件位置争夺战呢,不过就像喵神说的,一起都是为了让这个世界更美好啦 ☆:.。. o(≧▽≦)o .。.:

以上,如有错误欢迎批评指正。

, , , , , , ,

  • Cc Xu

    你好,我向问下。extension 可以设置 iTunes 文件共享吗?也就是他可以把自己的文件写道public目录下嘛?

    • 我试了下好像是不可以呢,extension 的文件不会出现在 iTunes 文件共享列表中,应该是要通过你的主程序来进行操作吧。