上一篇文章中我们已经详细的介绍了通知扩展怎么使用,无奈我们产品的设计又有了其他 奇(辣) 思(鸡) 妙(到) 想(死)的想法.
类似于这种就必须需要在通知扩展中拿到拿到主工程的配置
在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 就行。
以上两个操作在
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内的东西,所以我只有祭出杀器然后就是很顺利的访问了
最后为了你们看的方便,我把我宏的字段也给你们看
吼吼~结束了,本人文采太差了,见谅见谅哈 。希望对你们有点点帮助。