macOS 上沙盒化 Swift 应用程序的应用间通信

7

我正在使用Swift构建一个沙盒化的macOS应用程序,其中包含一个子应用程序。

我想要实现的功能是:

  • 父级应用可以启动多个子应用程序
  • 父级应用程序向每个子应用程序发送不同内容以显示
  • 父级应用程序和子应用程序都有自己的用户界面。

我一直在考虑的实现方式是:

分布式通知

带有用户信息对象的分布式通知被沙盒拒绝了。

CFMessagePort

它要求父级和子级应用都在同一个应用组中,并且使用适当的证书配置文件签名。但是,在Xcode上,证书配置文件设置始终为“无需”,所以无处更改设置。 此外,没有文档或文章说明如何在Swift中使用CFMessagePort。我尝试了下面的代码,但由于被沙盒拒绝,它每次都会崩溃。

let portName = "{team_identifier}.{app_group_identifier}.{port_name}"
let remote = CFMessagePortCreateRemote(nil, portName as CFString)
var returnData: Unmanaged<CFData>? = nil
if kCFMessagePortSuccess == CFMessagePortSendRequest(remote, 0, data as CFData, 1, 1, CFRunLoopMode.defaultMode.rawValue, &returnData) && nil != returnData {
    
}

NSXPCConnection

我认为XPC并不适用于此情况,因为XPC是设计用于在运行不可见的服务和客户端应用程序之间进行通信,而该服务被捆绑到应用程序中。我怀疑它是否适用于父子模型。


那么,有没有更好的方法来实现我的目标?我觉得我应该使用CFMessagePort,但我还需要一些关于如何在Swift中使用它的帮助。谢谢!


1
NSXPCConnection应该非常适合这种情况。你遇到了什么问题? - Rob Napier
你有开发者账户吗? - WikipediaBrown
@RobNapier,我对XPC的知识有所欠缺。据我所知,XPC服务本身对终端用户不可见,即使父应用程序包含一个XPC bundle,父级也不能使用XPC服务来发起消息发送请求到多个子应用程序。或者你可以给我一个结构示例,说明如何做到这一点吗?谢谢。 - Xiao Xiao
@WikipediaBrown 是的,我已经有开发者账户多年了,并且在 Mac App Store 上还有其他应用程序。 - Xiao Xiao
1个回答

2
我认为你最好使用像我一样使用Apple Events。沙盒应用程序默认情况下可以接收和发送自己的Apple事件,但是它们不能向其他应用程序发送Apple事件。但是,如果您请求“脚本目标”授权或“apple-events临时例外”授权,则可以发送Apple事件。同样,无论您的应用程序是否被沙盒化,任何试图与您的应用程序交互的外部沙盒化应用程序也必须请求适当的授权才能这样做。您可以在技术Q&A注释QA1888中了解所有相关信息。
我建议您查看这个 tutorial,以处理沙盒应用程序中的Apple事件,以及这个教程(part 1part 2),介绍了如何处理基础类,以便在Swift中构建Apple事件。如果您需要更详细的解释和示例代码(但大多数是C语言),可以参考苹果的参考页面,即:

如果遇到问题,请告诉我们,因为我使用这个古老但经过验证的技术来处理主应用程序和其助手之间的大部分IPC。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接