从沙盒应用程序启动助手

4

我有一个沙盒应用程序。每次启动时,我需要它启动一个助手应用程序(从主应用程序的捆绑包中)。然而,这样做失败了:

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

错误信息如下:
应用程序“Helper”无法启动,因为它已损坏。, NSUnderlyingError=0x10214c700 "The operation couldn’t be completed. (OSStatus error -10827.)"
现在,这个错误是误导性的,因为如果我禁用沙盒权限,该应用程序可以正常启动。显然,这是一个bug,正如这里所报道的那样。
我的问题是:有没有解决方法? 我可以使用SMLoginItemSetEnabled,如这里所述:
true传递给立即启动助手应用程序,并指示每次用户登录时都应启动它。将false传递以终止助手应用程序,并指示不再在用户登录时启动它。
但是,由于App Store审核指南2.26的原因,我无法在未经用户同意的情况下使用此API:
设置为自动启动或在启动或登录时自动运行其他代码的应用程序将被拒绝。
因此,使用此解决方法意味着要问用户“每次您登录时启动助手是否可以?” 如果不行,您无法使用此应用程序!显然,这不是理想的解决方案...

不确定这是否与rdar://10934199有关,因为即使用户已经手动启动了要尝试启动的应用程序,launchApplicationAtURL在沙盒下仍会失败。 - valexa
你能获取安装用户启动代理的权限吗?该代理将检查你的应用程序是否正在运行并启动辅助应用程序。 - Colin
2个回答

2
一个可行的解决方法是使用 NSTask 来启动 /usr/bin/open 并给它提供辅助应用程序的路径:
NSTask *task = [NSTask new];
[task setLaunchPath: @"/usr/bin/open"];
[task setArguments: [NSArray arrayWithObjects: helperPath, nil]];
[task launch];

这段代码在沙盒中运行良好,看起来符合Mac应用商店审核指南。

更新:进一步检查发现,这种技术经常会出现以下错误:

应用程序无法打开,因为其可执行文件丢失。

当我关闭沙盒时,不会出现此错误。因此,必须有更好的解决方案...


使用 /usr/bin/opendiff 在控制台中会产生以下错误:“xcrun: error: cannot be used within an App Sandbox.” 尽管苹果指南中声明“系统自动允许沙盒应用程序”“读取某些目录中的全局可读文件,包括以下目录:”“/usr/bin”... 我猜这不再是真的了? - Brad G

0

你可以使用SMLoginItemSetEnabled。你需要请求用户同意一次。之后,使用SMLoginItemSetEnabled首次启动的辅助应用程序将自动在每次用户登录时启动。


对我来说无效。我有一个只坐在菜单栏中没有窗口或 Dock 存在的应用程序。SMLoginItemSetEnabled 将注册助手,但助手无法启动主应用程序。该应用程序已被沙盒化以供应用商店使用。 - Duck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接