非常简单的 macOS XPC

Posted

技术标签:

【中文标题】非常简单的 macOS XPC【英文标题】:Very simple macOS XPC 【发布时间】:2019-12-19 14:18:00 【问题描述】:

我只想使用XPC 技术来启动app。我不需要任何进程间通信,也不需要 XPC 的任何其他功能。

我能在互联网上找到的唯一文档显示了一个复杂的结构,包括 XPC 服务的代码、通过脚本启动 XPC 服务的单独代码以及与服务通信的应用程序代码。

换句话说,我只想要与此等效的东西:

NSWorkspace.shared.openApplication(at: path,
                                   configuration: configuration,
                                   completionHandler: nil)

但使用 XPC。所以我需要一些类似的东西:

let listener = NSXPCListener.service("/path/to/my_app.app")
listener.resume()
RunLoop.main.run()

很明显,服务方法不接受可能是可执行路径的参数,所以这不起作用。

我该怎么做?

PS:为了解释动机,启动 XPC 服务将保留启动应用程序的沙盒限制,而直接通过 NSWorkspace.shared.openApplication 启动应用程序将不会保留沙盒限制(因为生成的应用程序没有“com.apple. security.inherit”作为权利)。

【问题讨论】:

NSTask 的文档说“在沙盒应用程序中,使用 NSTask 类创建的子进程继承父应用程序的沙盒”。这是否更简单地实现了您想要的? 感谢@TheNextman,这是个好主意。我刚试过。现在唯一的问题是沙盒启动器应用程序拒绝运行第三方应用程序。这个第三方应用使用不同的代码签名(因为它来自应用商店),所以这可能是问题......不确定。 我设法让它工作,但非常不幸的是,启动的应用程序实际上仍然没有沙盒。例如,我尝试使用 Safari,但我仍然可以浏览互联网...... 您要启动的应用程序是什么?它是沙盒的吗?它的权利是什么? 我尝试了一些不同的东西。我构建了一个空应用程序,并尝试了不同的权利。例如,只有沙盒权利。我也试过 Safari。 【参考方案1】:

在更改其沙箱时启动子进程似乎是不可能的(即给予它比最初赋予的更多或更少的权利)。

我推荐现有应用程序中的stripping the sandboxing,适当地修改权利,然后重新签名。这不是常规方法,但可以解决您的具体问题。

【讨论】:

以上是关于非常简单的 macOS XPC的主要内容,如果未能解决你的问题,请参考以下文章

如何在macOS上使用MTLSharedTextureHandle或MTLSharedEventHandle与C XPC接口?

macOS:在用户退出主应用程序后保持 XPC 服务(捆绑)运行

哪个处理程序在 macos xpc 中处理来自服务器的回复

如何禁用加载/激活 macOS xpc 服务?

XPC 服务可以链接到嵌入它的框架吗?

XPC 和异常处理