是否可以执行位于macOS应用程序沙箱容器中的二进制文件?

时间:2018-07-01 08:22:19

标签: swift macos process appstore-sandbox

是否可以执行位于macOS应用程序沙箱容器中的二进制文件?

作为测试,我尝试使用Process()运行PHP二进制文件。当运行在usr/bin/php上找到的PHP时,此方法工作正常,但是如果我将其复制到应用程序的沙箱容器中,它将无法运行。错误为launch path not accessible

展示问题的步骤:

  1. 将此内容放置在裸露的沙盒应用程序的ViewController中:

    let path = "/usr/bin/php"
    
    let process = Process()
    process.launchPath = path
    process.arguments = ["-v"]
    process.launch()
    
  2. 控制台中的结果:

    PHP 7.1.16 (cli) (built: Apr  1 2018 13:14:42) ( NTS )
    
  3. 将上面代码中的路径更改为:

    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let path = documentsURL.absoluteString + "php"
    print(path)
    
  4. 将正确的路径打印到控制台:

file:///Users/myuser/Library/Containers/com.domain.SandboxedApp/Data/Documents/php

  1. 将PHP二进制文件复制到容器:

    $ cp /usr/bin/php /Users/myuser/Library/Containers/com.domain.SandboxedApp/Data/Documents
    
  2. 控制台中产生的错误:

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上分发,我知道这会破坏条款。

0 个答案:

没有答案