7

我有一个 Mac OSX 应用程序,它启动位于 /Contents/Resources 中的可执行文件。该应用程序不打算在 App Store 上发布,因此我没有打开沙箱。

启动代码:

toolPath = [[[NSBundle mainBundle] pathForResource:@"myexecutable" ofType:@""] copy];
task = [[NSTask alloc] init];
[task setLaunchPath: toolPath];
pipe = [[NSPipe alloc] init];
[task setArguments:[NSArray arrayWithObjects:@"-someArg", someVariable, nil]];
file = [[NSFileHandle alloc] initWithFileDescriptor:[pipe fileHandleForReading].fileDescriptor];
[task setStandardOutput: stderrPipe];
[task launch];

问题是 - 在 Xcode 中运行时,这一切都很好。将应用程序导出到桌面并运行它时,它也可以正常工作。

但是,如果我压缩应用程序,将其上传到网络服务器,然后将其下载到同一台计算机上(或将其下载到另一台 Mac),任务将不再启动!我在系统控制台或任何东西中都没有错误。

我对此问题进行了一些研究,发现OSX会将新应用程序标记为“隔离”特殊权限。所以我调查了下载的应用程序和导出的应用程序之间的区别:

从 Xcode 导出我的应用程序后对可执行文件的权限:

-rwxr-xr-x  1 Username  staff   65724 21 Jul 16:31 executableName

此时应用程序工作正常,可执行文件从应用程序内的按钮启动。

压缩应用程序后,上传到服务器,下载,解压缩,打开应用程序并接受“此应用程序是从互联网下载的”对话框:

-rwxr-xr-x  1 Username  staff   65724 21 Jul 16:31 executableName
    com.apple.quarantine        26 

此时,当我按下应用程序中的按钮时,什么也没有发生。

如果我随后xattr -rd com.apple.quarantine在整个应用程序上运行,则会删除隔离通知:

-rwxr-xr-x  1 Username  staff   65724 21 Jul 16:31 executableName

但可执行文件仍未启动!

此时,我现在在我的桌面应用程序上拥有以下权限:

/内容/MacOS:

-rwxr-xr-x  1 Username  staff  407728 21 Jul 16:31 appName

/内容/资源:

-rwxr-xr-x  1 Username  staff   65724 21 Jul 16:31 executableName

在我使用 xattr -rd 下载的应用程序上:

/内容/MacOS:

-rwxr-xr-x  1 Username  staff  407728 21 Jul 16:31 appName

/内容/资源:

-rwxr-xr-x  1 Username  staff   65724 21 Jul 16:31 executableName

第一个应用程序运行良好,第二个应用程序从不启动可执行文件。到底他妈发生了什么?这是同一个应用程序,在同一台计算机上,具有相同的权限,但下载的应用程序不起作用。

此问题出现在不同计算机上的所有 OSX 版本中。

4

2 回答 2

8

com.apple.security.inherit权利添加到帮助应用程序为我解决了这个问题。

Could not set sandbox profile data: Operation not permitted (1)当我尝试使用 NSTask 启动它时,我的帮助应用程序曾经崩溃过。

来自苹果文档:

如果您的应用程序使用使用 posix_spawn 函数或 NSTask 类创建的子进程,您可以将子进程配置为继承其父进程的沙箱。但是,使用子进程并不能提供使用 XPC 服务所提供的安全性。

要启用沙盒继承,子目标必须使用两个 App Sandbox 授权密钥:com.apple.security.app-sandboxcom.apple.security.inherit。如果您指定任何其他 App Sandbox 权利,系统将中止子进程。但是,您可以通过 iCloud 和通知权利将其他功能授予子进程。

Xcode 项目中的主应用程序的继承权利不得有 YES 值。

我希望这个解决方案有所帮助。

于 2014-05-02T12:26:49.787 回答
1

我终于找到了导致这个问题的原因,它是在尝试使用 NSTask 启动一个写入文件的可执行文件时发生的。奇怪的是,这在原始帖子中提到的某些情况下可以正常工作。但是为了让它在其他计算机上工作,我最终使用了解决问题的STPrivilegedTask

于 2013-07-24T19:02:53.997 回答