我有一个沙盒应用程序。我需要它每次启动时启动一个帮助应用程序(从主应用程序的包中)。但是,这失败了:
NSError *error;
[[NSWorkspace sharedWorkspace] launchApplicationAtURL:helperURL
options:NSWorkspaceLaunchDefault
configuration:nil
error:&error];
错误是:
无法启动应用程序“Helper”,因为它已损坏。,NSUnderlyingError = 0x10214c700“操作无法完成。(OSStatus错误-10827。)”}
现在,该错误具有误导性,因为如果我禁用沙箱权利,应用程序就会启动。显然这是一个错误,正如报道here。
我的问题是:有解决方法吗?
我可以使用SMLoginItemSetEnabled
,如here所述:
传递
true
以立即启动帮助应用程序并指示应在每次用户登录时启动它。通过false
终止帮助应用程序并指示它不应再启动时用户登录。
但是,由于App Store Review Guideline 2.26,我无法在不先询问用户的情况下使用此API:
设置为自动启动或在启动时自动运行其他代码但未经用户同意登录的应用将被拒绝
因此,使用此解决方法意味着询问用户“每次登录时是否可以启动帮助程序?如果没有,则无法使用此应用程序!”显然,那不太理想......
答案 0 :(得分:2)
一个可行的解决方法是使用NSTask
生成/usr/bin/open
并为其提供帮助应用程序的路径:
NSTask *task = [NSTask new];
[task setLaunchPath: @"/usr/bin/open"];
[task setArguments: [NSArray arrayWithObjects: helperPath, nil]];
[task launch];
这可以从沙盒中正常运行,并且似乎与Mac App Store评论指南兼容。
更新:在进一步检查时,此技术经常因错误
而失败无法打开应用程序,因为缺少可执行文件。
当我关闭沙盒时,不会发生此错误。所以必须有一个更好的解决方案......
答案 1 :(得分:0)
您可以使用SMLoginItemSetEnabled。您必须征得用户同意一次。毕竟,每次用户登录时,都会自动启动第一次使用SMLoginItemSetEnabled启动的帮助应用程序。