Swift 4 launchProcess启动路径无法访问

时间:2017-11-03 16:22:37

标签: swift xcode swift4 xcode9

我正在Xcode 9中编写一个基于swift的macOS应用程序,以便在我的计算机上使用(未分发)。我在/ usr / local / bin中安装了EXIFtool(独立于应用程序),可以在终端应用程序中成功使用它。我正在尝试从我的应用程序访问EXIFtool。

我的应用程序有一个按钮,单击该按钮时应通过执行此脚本运行EXIFtool命令。

@IBAction func arrowClicked(_ sender: Any) {
    arrow.isEnabled = false
    let task = Process.launchedProcess(launchPath: "/usr/local/bin/exiftool", arguments: [rawURL])
    task.waitUntilExit()
    arrow.isEnabled = true
}

脚本失败,并且“#34;启动路径无法访问"错误。我作为参数输入的内容并不重要(在上面的代码片段中,rawURL是一个包含用户识别的图像文件路径的字符串。

我在这里找到类似问题的答案集中在路径的格式上(例如,必须是完整路径,以/开头等)。我的发布路径来自终端响应"哪个exiftool",所以我认为这是正确的。

更新:我按照Matt提供的链接重写了代码以利用shell脚本。我使脚本可执行并通过Terminal和TextWrangler成功运行它。但是在Xcode中访问它会导致"操作不被允许"消息。

2 个答案:

答案 0 :(得分:1)

关闭App Sandbox会解析原始的“启动路径无法访问”消息和修订后的尝试“不允许操作”消息。

答案 1 :(得分:0)

不幸的是,有很多原因导致一个二进制文件不能在沙盒环境中运行,而另一个二进制文件可以正常运行。

在您的情况下,您可以禁用沙箱,因此这是一个简单(明智的)修复方法,但是对于没有那么奢侈的任何人,下面是一些记录一些相关因素的信息。

有一个问题here,它问为什么/sbin/ping运行正常,而/usr/sbin/traceroute却运行不正常。

one of the answers处开始

  

pingtraceroute-前者是非特权程序,后者是特权并以root身份运行

您可以看到他们的权限不同:

$ ls /sbin/ping
-r-xr-xr-x  1 root  wheel    41K 30 May 11:36 /sbin/ping

$ ls /usr/sbin/traceroute
-r-sr-xr-x  1 root  wheel    37K 30 May 11:36 /usr/sbin/traceroute

跟踪路由上的s意味着它将以root的身份执行,这自然不会在沙盒环境中被允许。来自https://coderanch.com/t/110770/os/permissions-meaning#558594的以下内容可能会有所帮助:

  对于文件,

“ s”表示“ setuid exec”。如果文件具有权限,则该文件是可执行文件,此外,进程的用户ID和/或组ID设置为文件所有者的用户或组ID,具体取决于它是用户还是组设置好了。这是赋予用户有限的root权限的一种方法-一种在普通用户执行时以root身份运行的程序。

以下我称为Common app sandboxing issues的苹果技术问答QA1773讨论了一个二进制文件是否是Mach-O可执行文件:

  

您可以使用file命令检查二进制文件是否是Mach-O可执行文件。如果二进制文件的任何片段将其自身标识为Mach-O可执行文件或Mach-O 64位可执行文件,则必须对二进制文件进行沙箱处理。

对于ping,看起来像这样:

$ file /sbin/ping
/sbin/ping: Mach-O 64-bit executable x86_64

我的理解是,如果二进制文件是Mach-O executable,而您想从沙盒应用程序运行它,则必须:

  • 自己从源代码编译二进制文件,赋予其适当的权利,或者
  • 将代码导入到您的应用中,然后直接将其编译到您的应用中
相关问题