我正在开发一个应用程序,我从主应用程序中分离出两个不同的XPC服务。我希望XPC服务与其他XPC服务进行通信,这些服务将进行一些处理,并将数据返回给第一个服务,第一个服务将自行处理,然后将数据返回给主应用程序。我甚至试过这个,但是服务之间的通信给出了错误,即无法与帮助应用程序进行通信"。
我的问题是这是否有可能?如果是,那需要什么?
任何帮助都将不胜感激。
答案 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连接可以在之间交换端点其他两个过程。
在我的应用程序中,我最终创建了一个守护进程,它充当了我的基石,但我认为你可以直接在你的应用程序中完成它。以下是您需要做的事情:
listener = NSXPCListener.serviceListener
)或为第二个进程创建专用的匿名侦听器(使用listener = NSXPCListener.anonymousListener
)。listener.endpoint
)[[NSXPCConnection alloc] initWithListenerEndpoint:aEndpoint]]
。