TLDR:是否可以在 iOS 应用及其扩展程序之间发送实时消息或通知?
我正在编写一个 iOS 应用程序,其扩展名属于同一 App Group
并共享相同的 CoreData(SQLite 数据库)。我可以使用应用程序和扩展中的 CoreData 读取和写入数据库,它们共享相同的内容。
我的问题是:是否可以在应用程序和扩展程序之间发送消息或通知以通知对方在必要时进行更新?
我尝试通过 NSNotificationCenter
发送通知,但这并没有“超出”App/Extension,如果我尝试写入组共享 NSUserDefaults
和收听 NSUserDefaultsDidChangeNotification
。这在应用程序内部工作,但扩展程序没有收到任何东西(当我知道它已启动并且它共享相同的 NSUserDefaults
时)。知道如何保持同步吗?
最佳答案
TLDR:不,但是有一个 hack
无论有没有扩展,iOS 应用程序都没有真正的进程间通信。 NSDistributedNotification
还没有完成从 OS X 到 iOS 的旅程,而且可能不会。
对于某些扩展类型,您可以通过 NSExtensionContext
打开 URL,并使用它们将数据传递给处理该 URL 的应用程序。这会将应用带到前台,这听起来不像您想要的那样。
不过,有一种 hack 方法可以满足您的需求。
- 不要写入用户默认值,而是写入应用组目录中的文件。
- 不要直接写入文件——使用
NSFileCoordinator
对文件进行协调写入。 - 在想要了解文件更改的对象上实现
NSFilePresenter
,并确保调用[NSFileCoordinator addFilePresenter:someObject]
- 在文件展示器上实现可选的
presentedItemDidChange
方法。
如果您做对了所有这些,您可以从应用程序或扩展程序写入此文件,然后在另一个应用程序中自动调用 presentedItemDidChange
。作为奖励,您当然可以读取该文件的内容,因此您可以来回传递任意数据。
关于ios - iOS App Containing Extension 和 Extension (not Host App) 之间如何通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27011916/