辅助 Mac 应用程序(登录项)无法通信

6
我已经完全按照苹果提供的沙盒帮助器应用程序示例进行操作,一切似乎都运行正常。我能够成功地创建一个NSXPCConnection对象,并通过remoteObjectProxyWithErrorHandler获取我的远程对象。
但是,当我在代理对象上调用协议定义中的方法时,我会收到以下错误信息:
Failed to connect to launch agent: Error Domain=NSCocoaErrorDomain Code=4099 "Couldn’t communicate with a helper application.

无论我做什么,都无法与我的辅助应用进行通信。我没有做任何复杂的操作,只是尝试对辅助应用发起一个简单的调用,以便NSLog()输出一些内容。但是它不起作用。奇怪的是,我也看不到内部的任何输出:

- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection

我到底做错了什么?

更新: 显然,如果我在我的主应用程序上取消选中“启用应用沙箱”,它就会运行!因此,在启用沙箱之后,它不想与我的辅助应用程序通信。我需要更多的权限吗?我已经在xcode下尝试了它们所有的权限!


如果你打开控制台,是否会出现沙盒机器查找违规错误? - Samir
没有,但我找到了一个解决方案,下面会解释。 - strange
2个回答

12

您的辅助应用程序被限制在沙盒中,因此它无法动态注册mach服务,尽管Xcode允许这样做以进行调试。

但是,当您将辅助应用程序添加到登录项(使用SMLoginItemSetEnabled())中时,launchd将自动为您注册一个名为其包标识符的mach服务。

现在您的主应用程序也被限制在沙箱中,因此不允许随机的mach通信。使其正常运行的唯一方法是添加临时的mach查找权限。

自10.7.4版本以来,苹果引入了应用组权限作为解决方案,用于需要与辅助应用程序通信的情况。

两个应用程序必须共享相同的应用组权限。它可以是任何值,但Apple要求该值必须以您的 Team-ID 开头(例如:Team-id.myApp)。然后,您的辅助应用程序包标识符必须以相同的权限开头(例如:Team-id.myApp.myHelperApp)。之后,您的主应用程序可以使用名为辅助应用程序包标识符(即Team-id.myApp.myHelperApp)的XPC通信自由地与您的辅助应用程序通信。此外,这两个应用程序还将共享一个名为应用程序组权限的组容器文件夹(例如:~/Library/Group Containers/Team-id.myApp),如果需要,您必须手动创建它。


我已将您的回复标记为问题的正确答案。虽然我的努力也带我发现了同样的问题,但是您解释得非常好。现在唯一的问题是,在Xcode 5.0中,它无法对我的辅助应用进行代码签名,并抱怨TEAM-ID.com.mycompany.myapp与'com.mycompany.myapp'配置文件不匹配。我不知道该如何解决这个问题。 - strange
我已经有一些进展了,我可以在Xcode 5中对助手进行代码签名,它也能够启动并且我可以通过XPC进行通信,但是内核会发布代码签名错误,尽管codesign显示可执行文件具有有效的签名。此外,试图附加到助手会导致Xcode崩溃(已向bugreporter报告)。 - ctpenrose

4

好的,我已经吃了苦头——沙盒和XPC存在大量问题,更不要说助手应用程序以及使用所谓的“共享组目录”共享数据库了,这个目录既不会自动创建(正如文档错误地说的那样),也没有NSURL在文档中声称的方法。

虽然文档说,在授权中,你可以指定任何字符串作为格式为<TEAM_ID>.whatever的“共享应用程序标识符”,但显然只有使用格式<TEAM_ID>.com.yourcompany才能起作用。

其他任何东西都行不通。它会编译、存档、运行,但它不会让你与你的助手应用程序交流。花费约30小时后,我想,我试试最后一次改变,结果就是这样!接下来,我要在可怕的沙盒文档上提交一个雷达报告(很多人在苹果开发者论坛上都在抱怨)...


2
有关xpc连接的一个有价值的信息来源是man页面(在终端中键入man xpc_connection_create)。 - Samir
@strange,你能否看一下我在SO上关于同样问题的提问,并帮我解决一下 - 请参见:AVPlayer不允许我访问URL。 - Neal Davis

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