6

我已经完全按照 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下都试过了!

4

2 回答 2

12

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

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

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

从 10.7.4 开始。Apple 引入了应用程序组权利作为这种情况的解决方案,其中应用程序需要与帮助应用程序通信。

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

于 2012-09-01T19:38:57.963 回答
4

好的,所以我已经学会了艰难的方法 - 沙盒和 XPC 存在大量问题,更不用说使用所谓的“共享组目录”的辅助应用程序和共享数据库了,它们既不会自动创建(如文档错误所说),也不会NSURL提供它在文档中声称的方法。

尽管文档说在权利中您可以将任何字符串指定为格式中的“共享应用程序标识符”,但<TEAM_ID>.whatever显然它仅在您使用以下格式时才有效:<TEAM_ID>.com.yourcompany

别的什么都行不通。它会编译、存档、运行,但不会让您与帮助应用程序对话。花了大约 30 个小时后,我想我会尝试最后一次更改,显然就是这样!接下来对写得很糟糕的沙盒文档(Apple 开发者论坛上的很多人都在抱怨)提交雷达...

于 2012-09-01T18:36:33.290 回答