博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 8 中 Extension 和 Containing App 之间的数据共享
阅读量:4107 次
发布时间:2019-05-25

本文共 1848 字,大约阅读时间需要 6 分钟。

扩展(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

喵神在已经有了非常详尽的介绍,总之你需要在项目中添加一个 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 Groups需要在Apple的官网先注册生成

然后在Xcode中会同步看到

现在你把原来存在 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"];

参考

你可能感兴趣的文章
Linux epoll模型
查看>>
Linux系统编程——线程池
查看>>
Linux系统编程——线程池
查看>>
yfan.qiu linux硬链接与软链接
查看>>
Linux C++线程池实例
查看>>
shared_ptr简介以及常见问题
查看>>
c++11 你需要知道这些就够了
查看>>
c++11 你需要知道这些就够了
查看>>
shared_ptr的一些尴尬
查看>>
C++总结8——shared_ptr和weak_ptr智能指针
查看>>
c++写时拷贝1
查看>>
C++ 写时拷贝 2
查看>>
Linux网络编程---I/O复用模型之poll
查看>>
Java NIO详解
查看>>
Statement与PreparedStatement区别
查看>>
Tomcat配置数据源步骤以及使用JNDI
查看>>
before start of result set 是什么错误
查看>>
(正则表达式)表单验证
查看>>
在JS中 onclick="save();return false;"return false是
查看>>
JSTL 常用标签总结
查看>>