我正在编写一个具有扩展名的iOS应用程序,它是同一个App Group的一部分,并且共享相同的CoreData(sqlite数据库).我可以使用CoreData从应用程序和扩展名读写数据库,它们都共享相同的内容.
我的问题是:是否可以在应用程序和扩展名之间发送消息或通知,以通知对方如有必要更新?
我尝试通过NSNotificationCenter发送通知,但是如果我尝试写入共享NSUserDefaults的组,并且收听NSUserDefaultsDidChangeNotification,那么这个问题不会在App / Extension中出现.这在App内部工作,但扩展名没有收到任何东西(当我知道它被启动并且共享相同的NSUserDefaults)时.任何想法如何保持同步?
解决方法
iOS应用没有真正的进程间通信,有或没有扩展. NSDistributedNotification仍然没有从OS X到iOS的旅程,可能不会.
使用某些扩展类型,您可以通过NSExtensionContext打开URL,并使用它们将数据传递到处理该URL的应用程序.这使应用程序到前台,这听起来不像你想要的.
有一个黑客可能会让你得到你所需要的东西.
>而不是写入用户默认值,写入您的应用程序组目录中的文件.
>不要直接写文件 – 使用NSFileCoordinator对文件进行协调写入.
>在想知道文件更改的对象上实现NSFilePresenter,并确保调用[NSFileCoordinator addFilePresenter:someObject]
>在你的文件主持人上实现可选的itemsItemDidChange方法.
如果您执行所有这些权限,您可以从应用程序或扩展名写入此文件,然后在另一个中自动调用presentItemDidChange.作为一个奖励,你当然可以读取该文件的内容,所以你可以传递任意数据来回.