对于一直在努力解决这个问题的人,我终于成功地使用 NSXPCConnection
在两个应用程序之间实现了100%的通信。
需要注意的关键点是,你只能创建一个NSXPCConnection
来连接三件事情:
- XPC服务。您可以通过名称严格连接到XPC服务。
- Mach服务。 您也可以通过名称严格连接到Mach服务。
NSXPCEndpoint
。 这是我们正在寻找的,用于在两个应用程序之间进行通信。
问题在于我们无法直接从一个应用程序传输一个NSXPCEndpoint
到另一个应用程序。
必须创建一个包含NSXPCEndpoint
属性的 machservice Launch Agent(请参见此示例)。一个应用程序可以连接到machservice,并将该属性设置为自己的[NSXPCListener anonymousListener].endpoint
然后,另一个应用程序可以连接到machservice,并请求该端点。
然后,使用该端点可以创建一个NSXPCConnection
,成功地在两个应用程序之间建立了桥梁。我已经测试了来回发送对象,它都按预期工作。
请注意,如果您的应用程序受到沙箱限制,则必须创建一个XPCService
,作为应用程序和Machservice之间的中间人。
我很高兴我解决了这个问题-- 我在SO上相当活跃,所以如果有人对源代码感兴趣,只需添加评论,我可以投入更多时间来发布更多细节。
我遇到的一些问题:
必须启动machservice,以下是相关代码:
OSStatus err;
AuthorizationExternalForm extForm;
err = AuthorizationCreate(NULL, NULL, 0, &self->_authRef);
if (err == errAuthorizationSuccess)
assert(err == errAuthorizationSuccess);
Boolean success;
CFErrorRef error;
success = SMJobBless(
kSMDomainSystemLaunchd,
CFSTR("DAEMON IDENTIFIER HERE"),
self->_authRef,
&error
);
同时,每次重新生成您的守护程序时,您都需要使用以下bash命令卸载先前的启动代理:
sudo launchctl unload /Library/LaunchDaemons/com.example.apple-samplecode.EBAS.HelperTool.plist
sudo rm /Library/LaunchDaemons/com.example.apple-samplecode.EBAS.HelperTool.plist
sudo rm /Library/PrivilegedHelperTools/com.example.apple-samplecode.EBAS.HelperTool
(当然要使用您对应的标识符)