我有一个窗口化的应用程序和无窗口的帮助程序,位于应用程序捆绑包中,并作为登录项。应用程序可以启动和停止帮助程序,一切都在那里。问题是我需要在它们之间创建一些双向通信通道。而且它应该在沙盒版本和非沙盒版本中都可以使用,最好在OS X 10.7+中使用。
我研究了该主题,发现XPC可以提供对等连接。我已经阅读了相关的Apple文档以及以下几个主题:
是否可以使用IPC之类的Mac OS X XPC在进程之间交换消息?怎么样?
使用XPC与另一个应用程序进行通信
http://afewguyscoding.com/2012/07/ipc-easy-introducing-xpc-nsxpcconnection/
https://www.objc.io/issues/14-mac/xpc/
但是我找不到关于如何组织XCode项目的任何描述。我有两个目标:“主应用程序”和“帮助程序应用程序”。现在,我需要添加第三个,以XPC服务为模板。好的,但是下一步该怎么办?该XPC捆绑包应位于何处,以供两个应用程序使用?请注意,该帮助程序位于主应用程序包中,因为它是一个登录项。因此,我需要一些明确的说明,或者只需要一个XCode项目示例。
谢谢亚历克斯
好的,对于那些为此一直苦苦挣扎的人,我终于能够100%使两个应用程序进程之间的通信正常进行, NSXPCConnection
需要注意的关键是您只能创建一个NSXPCConnection
到三个项目。
XPCService。您可以严格通过名称连接到XPCService
马赫服务。您也可以严格通过名称连接到Mach服务
的NSXPCEndpoint
。这就是我们在两个应用程序进程之间进行通信所要的。
问题是我们不能直接将NSXPCEndpoint
一个应用程序从一个应用程序转移到另一个应用程序。
它涉及到创建一个拥有属性的machservice启动代理(有关此操作,请参见此示例)NSXPCEndpoint
。一个应用程序可以连接到machservice,并将该属性设置为它自己的[NSXPCListener anonymousListener].endpoint
然后,另一个应用程序可以连接到machservice,并请求该端点。
然后,NSXPCConnection
可以使用该端点创建一个,成功在两个应用程序之间建立了桥梁。我已经测试了来回发送对象,并且一切正常。
请注意,如果您的应用程序是沙盒,则必须XPCService
在应用程序和Machservice之间创建一个,作为中间人。
我非常高兴能做到这一点-我在SO中相当活跃,因此,如果有人对源代码感兴趣,只需添加注释,我就可以努力发布更多详细信息
我遇到的一些障碍:
您必须启动您的machservice,这些行是:
OSStatus err; AuthorizationExternalForm extForm; err = AuthorizationCreate(NULL, NULL, 0, &self->_authRef); if (err == errAuthorizationSuccess) { NSLog(@"SUCCESS AUTHORIZING DAEMON"); } 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
(当然,带有您的相应标识符)