非常简单的 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接口?