ios - iOS App Containing Extension 和 Extension (not Host App) 之间如何通信

标签 ios core-data swift nsnotificationcenter ios-extensions

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/

相关文章:

iphone - 将 NSString 转换为货币——完整的故事

ios - 使用两个持久存储协调器进行高效后台更新的陷阱

swift - 如何在 Core Data (Swift) 中保存和检索 .mp4

swift - 如何更改标签中某些单词的颜色 - Swift 3

ios - 在向其内容添加宽度和高度约束后,UIScrollView 滚动停止工作

ios - 如何获取图像引用并将图像上传到 Firebase?

ios - 我可以拥有一个部分在 Swift 中实现,部分在 Objective C 中实现的类吗?

cocoa - Core Data 内部方法崩溃 (SIGSEGV)

ios - 设置UIButton图像的内容模式

ios - 使用 Swift 自定义导航栏