是否可以执行位于macOS应用程序沙箱容器中的二进制文件?
作为测试,我尝试使用Process()
运行PHP二进制文件。当运行在usr/bin/php
上找到的PHP时,此方法工作正常,但是如果我将其复制到应用程序的沙箱容器中,它将无法运行。错误为launch path not accessible
。
展示问题的步骤:
将此内容放置在裸露的沙盒应用程序的ViewController
中:
let path = "/usr/bin/php"
let process = Process()
process.launchPath = path
process.arguments = ["-v"]
process.launch()
控制台中的结果:
PHP 7.1.16 (cli) (built: Apr 1 2018 13:14:42) ( NTS )
将上面代码中的路径更改为:
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let path = documentsURL.absoluteString + "php"
print(path)
将正确的路径打印到控制台:
file:///Users/myuser/Library/Containers/com.domain.SandboxedApp/Data/Documents/php
将PHP二进制文件复制到容器:
$ cp /usr/bin/php /Users/myuser/Library/Containers/com.domain.SandboxedApp/Data/Documents
控制台中产生的错误:
2018-07-01 20:08:30.630442+1200 SandboxedApp[43579:20898286] Failed to set (contentViewController) user defined inspected property on (NSWindow): launch path not accessible
为什么Process()
无法从容器中运行PHP?为什么会有这么奇怪的错误消息?
(nb,您可能会问我为什么要这样做。有几个原因,例如,我想更深入地了解沙盒权限的工作方式;我想对一个能够运行用户的应用进行沙盒-提供的不是macOS提供的二进制文件,也不是在应用程序的捆绑软件中分发的二进制文件-是的,不打算在MAS上分发,我知道这会破坏条款。