我完全像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下尝试了所有这些!
解决方法
您的帮助应用程序是沙箱.因此,它不能动态注册mach服务,尽管Xcode允许它用于调试目的.
但是,当您将帮助应用程序添加到登录项时(使用SMLoginItemSetEnabled()),launchd将自动为您命名一个名为bundle标识符的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),如果需要,您必须手动创建.