KVO与Swift中的共享NSUserDefaults

时间:2015-02-26 07:15:34

标签: swift ios7 ios8

我通过传达NSUserDefaults更改来解决主机应用与其扩展之间的通信问题。

我使用NSUserDefaults初始化了init(suiteName:),使用addObserver(...)方法添加了KVO观察者,并覆盖了方法observeValueForKeyPath(...),但是我没有调用方法observeValueForKeyPath(...)更改与观察key对应的值。如果你帮我解决这个问题会很棒。

PS:此处套件名称为应用程序组名称,使用NSUserDefaults创建的suiteName as group identifier将位于应用程序组的私有区域内。

2 个答案:

答案 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在整个过程中都可以完美运行。