XPC到XPC通信

时间:2017-01-10 10:45:24

标签: macos xpc nsxpcconnection

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

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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

所以我发现两个进程不可避免地无法与同一个XPCService进行通信。这是因为如果您尝试启动XPCService,它将是启动器的唯一过程。据我所知,您只能与您的流程启动的XPCService进行通信。

所以我相信你的第二个XPCService将无法“启动”第一个XPCService,因此将无法与之通信。

您可以做的最好的事情是让您的第二个XPCService与您的主应用程序进程通信,然后与第一个XPCService进行通信。

您可以执行以下操作:

   [[self.firstXPCConnection remoteObjectProxy] getSomeString:^(NSString *myString) {
        [[self.secondXPCConnection remoteObjectProxy] passSomeString:myString];
   }];

虽然免责声明,但我没试过。但我能用你所掌握的知识帮助你最好的

答案 1 :(得分:0)

是的,这是可能的,但一点也不明显。在苹果工程师的一个模糊暗示导致我偶然发现答案之前,我在一年之前询问了关于这个确切事情的问题。

诀窍是你需要将一个进程的NSXPCListenerEndpoint转移到另一个进程。然后,第二个进程可以使用该端点对象创建与第一个进程的直接连接。问题是,虽然NSXPCListenerEndpoint符合NSCoding,但它只能通过现有的XPC连接进行编码,这使得这个问题听起来像是一个catch-22(你无法转移端点)直到您创建了连接,并且在拥有端点之前无法创建连接。

解决方案("技巧")是你需要一个中间过程(让我们称之为#34;基石")已经有一个XPC连接可以在之间交换端点其他两个过程。

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

  1. 使用两个XPC服务创建一个应用程序," A"和" B"
  2. 在" A"获取进程的侦听器对象:获取自动创建的服务侦听器(listener = NSXPCListener.serviceListener)或为第二个进程创建专用的匿名侦听器(使用listener = NSXPCListener.anonymousListener)。
  3. 获取侦听器的端点(listener.endpoint
  4. 应用程序应该询问" A"为其终点。
  5. 然后应用程序可以启动" B"然后,再次使用XPC,传递它从" A"到" B"。
  6. " B"现在可以使用它从" A" (通过应用程序)创建与" A"的直接连接。使用[[NSXPCConnection alloc] initWithListenerEndpoint:aEndpoint]]