【问题标题】:Launch helper from sandboxed application从沙盒应用程序启动助手
【发布时间】:2012-04-29 01:26:31
【问题描述】:

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

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:

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

因此,使用此解决方法意味着询问用户“是否可以在每次登录时启动帮助程序?如果不是,则无法使用此应用程序!”显然,这并不理想......

【问题讨论】:

  • 不确定这是否与 rdar://10934199 有关,因为 launchApplicationAtURL 在沙盒下失败,即使它尝试启动的应用程序已经由用户手动启动
  • 您能否获得安装用户启动代理的权限,该代理会检查您的应用是否正在运行并启动帮助应用?

标签: cocoa appstore-sandbox


【解决方案1】:

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

NSTask *task = [NSTask new];
[task setLaunchPath: @"/usr/bin/open"];
[task setArguments: [NSArray arrayWithObjects: helperPath, nil]];
[task launch];

这在沙盒中运行良好,并且似乎与 Mac App Store Review Guidelines 兼容。

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

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

关闭沙盒后不会出现此错误。所以一定有更好的解决方案...

【讨论】:

  • 使用 /usr/bin/opendiff 在控制台中产生以下错误“xcrun: error: cannot be used in an App Sandbox.”即使 Apple 指南声明“系统自动允许沙盒应用程序”“读取世界可读的文件,在某些目录中,包括以下目录:”“/usr/bin”......我想这不再是真的了吗?
【解决方案2】:

您可以使用 SMLoginItemSetEnabled。您必须征得用户同意一次。毕竟,第一次使用 SMLoginItemSetEnabled 启动的帮助应用程序会在用户每次登录时自动启动。

【讨论】:

  • 不适合我。我有一个应用程序,它只位于菜单栏中,没有窗口或停靠栏。 SMLoginItemSetEnabled 将注册助手,但助手无法启动主应用程序。该应用已针对应用商店进行沙盒处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多