如何使用应用程序扩展中的 IPC 将信息异步发送到 iOS 上的包含应用程序?

Posted

技术标签:

【中文标题】如何使用应用程序扩展中的 IPC 将信息异步发送到 iOS 上的包含应用程序?【英文标题】:How can I use IPC from an app extension to asynchronously send information to the containing app on iOS? 【发布时间】:2020-07-16 00:32:53 【问题描述】:

我想在我的应用扩展中使用进程间通信来在扩展对应用组的UserDefaults 数据库进行更改时通知其包含的应用。目前,似乎没有办法在UserDefaults 数据库被不同的进程更新时得到通知,所以我假设我必须在扩展程序和包含的应用程序之间建立 IPC。 According to Apple's documentation,这似乎可以使用多种不同的方法:

组内的应用程序可以使用 IPC 机制(包括 Mach IPC、POSIX 信号量和共享内存以及 UNIX 域套接字)与组中的其他成员通信。在 macOS 中,使用应用组来启用两个沙盒应用之间或沙盒应用与非沙盒应用之间的 IPC 通信。

我做了一些研究,似乎这些技术中的大多数都是请求驱动的,而不是异步的。有没有使用这些技术的好方法,以便我的扩展程序可以在更改应用程序组的UserDefaults 时通知我的应用程序?

附加信息:

我正在构建的扩展是广播上传扩展。 UserDefaults.didChangeNotification 不能跨进程工作,因此不适用于此目的。 Swift 中的解决方案是理想的,但 Objective-C 也可以。

【问题讨论】:

【参考方案1】:

我知道这有点晚了,但其他人可能会发现它已满。

对于进程间通知,ios/macOS 使用Darwin Notification。 Here is a nice article elaborating on how to notify two/more processes about the changes made through one of the processes on CoreData,但可以使用相同的方法通知任何事件。即在 UserDefaults 更新时生成通知。我已经尝试过了,它对于共享 AppGroup 的应用程序非常有效,不确定它是否适用于没有 AppGroup 的应用程序。

更新 1: Here is an article that talks about a different approach using NSFilePresenter for Interprocess notification and also adds a comparison with DarwinNotification.这是一篇很好的文章,可以全面了解AppGroup/SharedContainers和IPC

【讨论】:

以上是关于如何使用应用程序扩展中的 IPC 将信息异步发送到 iOS 上的包含应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

链表 IPC C 语言

通过 Electron 的 IPC 渲染器发送敏感数据

如何使用netlink进行IPC?

Firebreath 中的 IPC (boost c++)

使用 IPC 中断正在运行的进程

如何在不同进程中从远程服务向 IPC 客户端发送数据