帮手mac app(登录项目),无法与之通信

时间:2012-09-01 13:28:01

标签: objective-c xcode macos cocoa

我完全像Apple提供的Sandboxed Helper App示例一样,所有这些都运行正常。我能够成功创建一个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下尝试了所有这些!

2 个答案:

答案 0 :(得分:12)

您的帮助应用程序是沙箱。因此,它不能动态注册mach服务,尽管Xcode允许它用于调试目的。

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

现在您的主要应用程序是沙盒。因此,不允许随机通信。使其工作的唯一方法是添加临时的马赫查找权利。

自10.7.4起。 Apple将应用程序组权利作为此案例的解决方案引入,其中应用程序需要与帮助应用程序通信。

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

答案 1 :(得分:4)

好的,所以我学到了很多困难 - Sandboxing和XPC存在很多问题,更不用说辅助应用程序和共享数据库使用所谓的'共享组目录',它们既不会自动创建(因为文档错误地说)NSURL也没有提供它在文档中声称的方法。

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

其他任何东西都无效。它会编译,它会存档,它会运行,但它不会让你与你的帮助应用程序交谈。花了大约30个小时后,我想我会尝试最后一次改变,显然就是这样!在可怕的书面沙盒文档(苹果公司的开发者论坛上有很多人抱怨)中为雷达提供了一个雷达......