上一篇文章中我们已经详细的介绍了通知扩展怎么使用,无奈我们产品的设计又有了其他 奇(辣) 思(鸡) 妙(到) 想(死)的想法.
产品设计图
类似于这种就必须需要在通知扩展中拿到拿到主工程的配置
在iOS 8系统之前,每一个app在物理上都是彼此独立的,app之间不能互访彼此的私有数据。而在引入扩展之后,其他app可以与扩展进行数据交换。基于安全和性能的考虑,每一个扩展运行在一个单独的进程中,它拥有自己的bundle, bundle后缀名是.appex。扩展bundle必须包含在一个普通应用的bundle的内部。
通知扩展
但是可能是本人太笨的原因,还是无法在通知扩展中调用主工程的配置,于是我在网上废了很长一段时间去搜资料(其实是自己太懒,没有认真搜),终于被我找到了一个神奇的东西App Groups
App Groups
iOS8之后苹果加入了App Groups功能,应用程序之间可以通过同一个group来共享资源,app group可以通过NSUserDefaults进行小量数据的共享,或者使用 NSFileCoordinator 和NSFilePresenter 甚至是 CoreData 和 SQLite 来进行更大的文件或者是更复杂的数据交互。
首先我们需要开启 App Groups。得益于 Xcode 5 开始引入的Capabilities,这变得非常简单(至少不再需要去 developer portal 了)。选择主ZYBaseTest,打开它的 Capabilities 选项卡,找到 App Groups 并打开开关,然后添加一个你能记得的 group名字,比如 group.ZYNotificationServiceGr。接下来你还需要为 ZYBaseTestPushExtend 这个 target 进行同样的配置,只不过不再需要新建 group,而是勾选刚才创建的 group 就行。
主工程
屏幕快照 2018-04-11 上午9.00.59.png
通知扩展
以上两个操作在
ZYBaseTest和ZYBaseTestPushExtend两个target中都需要设置好,设置好了之后,数据就可以共享了。
注意 ,坑点要来了
一般我们都是使用NSUserDefault来存储一些小的配置,比如我就是存的用户是否开启了语音播报、是否选择了简易的语音播报。我相信大家一般都是用[NSUserDefaults standardUserDefaults]来创建NSUserDefaults对象,但是如果通过这种方式创建的话,你是无法在通知扩展中拿到你在主工程中设置的NSUserDefaults信息!!
在这里,存储数据时,一定要通过[[NSUserDefaults alloc] initWithSuiteName:@"groupName"]这个格式去创建NSUserDefaults对象,groupName填写当前设置AppGroups勾选的名字(比如我的就是group.ZYNotificationServiceGr)
创建方法区别
-
initWithSuiteName会在Library/Preference下新建一个以name为名字的plist文件 (两个访问的是同一个plist) -
[NSUserDefaults standardUserDefaults]是以bundle id为名字的一个plist文件 (两个访问的是不同的plist)
AA:利用这个我们可以给每一个用户新建一个偏好设置的文件,保存皮肤,字体等,不同的用户登录就会有不同的效果。
另外可能是我个人的原因吧,即使设置了APP group我还是无法在通知扩展中访问pch内的东西,所以我只有祭出杀器
大杀器-手动导入
然后就是很顺利的访问了
通知扩展中的代码
最后为了你们看的方便,我把我宏的字段也给你们看
宏的字段
吼吼~结束了,本人文采太差了,见谅见谅哈 。希望对你们有点点帮助。










网友评论