首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XPC到XPC通信

XPC到XPC通信
EN

Stack Overflow用户
提问于 2017-01-10 18:45:24
回答 2查看 1.1K关注 0票数 2

我正在开发一个应用程序,在这个应用程序中,我从主应用程序中分离出了两个不同的XPC服务。我希望XPC服务与其他XPC服务通信,XPC服务将进行一些处理,并将数据返回给第一个服务,第一个服务将进行自己的处理,然后将数据返回给主应用程序。我甚至尝试过这样做,但服务之间的通信给出了“无法与助手应用程序通信”的错误。

我的问题是,这是可能还是不可能?如果是,那么需要什么?

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2018-05-20 05:18:25

是的,这是可能的,但一点也不明显。我断断续续地问了一年关于这件事的问题,直到一位苹果工程师的晦涩提示让我偶然发现了答案。

诀窍在于,您需要将一个进程的NSXPCListenerEndpoint传输到另一个进程。然后,第二个进程可以使用该端点对象来创建与第一个进程的直接连接。问题是,虽然NSXPCListenerEndpoint兼容NSCoding,但它只能通过现有的XPC连接进行编码,这使得这个问题听起来像是个难题(在创建连接之前不能传输端点,在拥有端点之前不能创建连接)。

解决方案(“诀窍”)是您需要一个中介进程(让我们称其为“基石”),该进程已经具有可以在其他两个进程之间交换端点的XPC连接。

在我的应用程序中,我最终创建了一个守护进程,作为我的基石,但我认为你可以直接在你的应用程序中完成。下面是你需要做的:

获取进程的侦听器对象:获取自动创建的服务侦听器(listener = NSXPCListener.serviceListener)或为第二个进程创建专用的、匿名的侦听器(使用listener = NSXPCListener.anonymousListener).

  • Get侦听器(listener.endpoint)

  • The应用程序的端点应该向"A“请求其endpoint.

  • The应用程序可以启动"B”,并且,再次使用XPC,将从"A“获得的终结点传递给”B“。

  • ”B“现在可以使用它从"A”(通过应用程序)获得的终结点对象通过[[NSXPCConnection alloc] initWithListenerEndpoint:aEndpoint]].

创建到"A“的直接连接

票数 3
EN

Stack Overflow用户

发布于 2017-02-07 07:03:03

因此,我发现两个进程不可避免地无法与同一个XPCService通信。这是因为如果您尝试启动一个XPCService,它对于启动器来说将是一个独特的过程。据我所知,您只能与您的进程启动的XPCService通信。

因此,我相信您的第二个XPCService将无法“启动”第一个XPCService,因此将无法与其通信。

最好的办法可能是让第二个XPCService与主应用程序进程通信,然后主应用程序进程再与第一个XPCService通信。

你可以这样做:

代码语言:javascript
复制
   [[self.firstXPCConnection remoteObjectProxy] getSomeString:^(NSString *myString) {
        [[self.secondXPCConnection remoteObjectProxy] passSomeString:myString];
   }];

虽然是免责声明,但我还没有尝试过。但据我所知,我能帮你的最多

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41566916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档