我通过传达NSUserDefaults更改来解决主机应用与其扩展之间的通信问题。
我使用NSUserDefaults
初始化了init(suiteName:)
,使用addObserver(...)
方法添加了KVO观察者,并覆盖了方法observeValueForKeyPath(...)
,但是我没有调用方法observeValueForKeyPath(...)
更改与观察key
对应的值。如果你帮我解决这个问题会很棒。
PS:此处套件名称为应用程序组名称,使用NSUserDefaults
创建的suiteName as group identifier
将位于应用程序组的私有区域内。
答案 0 :(得分:2)
简短的回答是,您无法在NSUserDefaults
上使用KVO甚至NSNotificationCenter来传达App Extension和包含应用程序之间的更改。
有great post by Atomic Bird查看协调沟通的方式。特别值得一看的是他对通信用户默认值变化的分析:
应用/扩展程序通知的另一种选择是使用 达尔文通知中心通过 CFNotificationCenterGetDarwinNotifyCenter,实际上有点儿 有点像NSDistributedNotificationCenter。有一些讨论 这是由Apple的开发论坛网站上的Wade Spires撰写的。
我说“可能”,因为我对这种情况并不是100%有信心 工作。在此方法的文档中,Apple注意到
一个应用程序只有一个Darwin通知中心,所以这个 函数每次调用时都返回相同的值。
所以虽然这显然是合法的,但听起来也很像 违反了应用扩展限制中固有的哲学,即: 他们无法从托管应用程序访问任何东西。这就是为什么 [UIApplication sharedApplication]在扩展中不受限制。我不能 帮助想知道是否允许CFNotificationCenterGetDarwinNotifyCenter 在某些时候可能会“固定”的疏忽。
所以我想现在一个好的解决方案可能是使用MMWormhole来实现上述解决方案。
您的另一个选择是每次应用程序处于活动状态时检查用户默认值,并确认是否有任何键已更改,发布相关通知等。
祝你好运答案 1 :(得分:0)
经过测试,对于高于10.0的iOS版本,UserDefatuls的KVO在整个过程中都可以完美运行。