当前位置:  开发笔记 > 编程语言 > 正文

Mac OS X XPC作为两个应用程序之间的IPC

如何解决《MacOSXXPC作为两个应用程序之间的IPC》经验,为你挑选了1个好方法。

我有一个窗口化的应用程序和无窗口的帮助程序,位于应用程序捆绑包中,并作为登录项。应用程序可以启动和停止帮助程序,一切都在那里。问题是我需要在它们之间创建一些双向通信通道。而且它应该在沙盒版本和非沙盒版本中都可以使用,最好在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项目示例。

谢谢亚历克斯



1> A O..:

好的,对于那些为此一直苦苦挣扎的人,我终于能够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

(当然,带有您的相应标识符)

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有