Cocoa 从沙盒应用程序启动帮助程序

Cocoa 从沙盒应用程序启动帮助程序,cocoa,appstore-sandbox,Cocoa,Appstore Sandbox,我有一个沙盒应用程序。我需要它在每次启动时启动一个助手应用程序(从主应用程序包中)。但是,这一点失败了: NSError *error; [[NSWorkspace sharedWorkspace] launchApplicationAtURL:helperURL options:NSWorkspaceLaunchDefault configuration:nil

我有一个沙盒应用程序。我需要它在每次启动时启动一个助手应用程序(从主应用程序包中)。但是,这一点失败了:

NSError *error;
[[NSWorkspace sharedWorkspace] launchApplicationAtURL:helperURL
                               options:NSWorkspaceLaunchDefault
                               configuration:nil
                               error:&error];
错误是:

无法启动应用程序“Helper”,因为它已损坏。NSUnderlyingError=0x10214c700“操作无法完成。(OSStatus错误-10827。)”}

现在,这个错误是误导性的,因为如果我禁用沙盒权限,应用程序可以正常启动。据报道,这显然是一个bug

我的问题是:有解决办法吗?

我可以使用
SMLoginItemSetEnabled
,如下所述:

传递
true
以立即启动助手应用程序,并指示应在用户每次登录时启动该应用程序。传递
false
以终止helper应用程序,并指示用户登录时不应再启动该应用程序

但是,我不能在不询问用户的情况下使用此API,因为应用商店审查指南2.26:

未经用户同意,设置为自动启动或在启动或登录时自动运行其他代码的应用将被拒绝


因此,使用此解决方法意味着询问用户“您每次登录时都可以启动帮助程序吗?如果不行,您就不能使用此应用程序!”显然,这并不理想……

一个可行的解决方法是使用
NSTask
生成
/usr/bin/open
,并为其提供帮助程序的路径:

NSTask *task = [NSTask new];
[task setLaunchPath: @"/usr/bin/open"];
[task setArguments: [NSArray arrayWithObjects: helperPath, nil]];
[task launch];
这在沙箱中运行良好,并且似乎与Mac应用商店审查指南兼容

更新:在进一步检查时,此技术经常失败并出现错误

无法打开应用程序,因为缺少其可执行文件


关闭沙箱后不会发生此错误。所以一定有更好的解决方案…

您可以使用SMLoginItemSetEnabled。您必须请求用户同意一次。毕竟,,首次启动并启用SMLoginItemSetEnabled的helper应用程序将在用户每次登录时自动启动。

不确定这是否与rdar://10934199 因为launchApplicationaURL在沙箱下失败,即使它试图启动的应用程序已经由用户手动启动,您可以获得启动的权限吗安装一个用户启动代理,用于检查您的应用程序是否正在运行并启动helper应用程序?使用/usr/bin/opendiff会在控制台中产生以下错误“xcrun:error:无法在应用程序沙盒中使用”。即使Apple指南声明“系统自动允许沙盒应用程序运行”在某些目录(包括以下目录)中读取全球可读的文件:“”/usr/bin"... 我想这不再是真的了?不再为我工作了。我有一个应用程序,只是坐在菜单栏,没有窗口或码头存在
SMLoginItemSetEnabled
将注册帮助者,但帮助者无法启动主应用程序。应用程序已为应用程序商店沙盒。