我正在开发一个应用程序,在这个应用程序中,我从主应用程序中分离出了两个不同的XPC服务。我希望XPC服务与其他XPC服务通信,XPC服务将进行一些处理,并将数据返回给第一个服务,第一个服务将进行自己的处理,然后将数据返回给主应用程序。我甚至尝试过这样做,但服务之间的通信给出了“无法与助手应用程序通信”的错误。
我的问题是,这是可能还是不可能?如果是,那么需要什么?
任何帮助都将不胜感激。
发布于 2018-05-20 05:18:25
是的,这是可能的,但一点也不明显。我断断续续地问了一年关于这件事的问题,直到一位苹果工程师的晦涩提示让我偶然发现了答案。
诀窍在于,您需要将一个进程的NSXPCListenerEndpoint传输到另一个进程。然后,第二个进程可以使用该端点对象来创建与第一个进程的直接连接。问题是,虽然NSXPCListenerEndpoint兼容NSCoding,但它只能通过现有的XPC连接进行编码,这使得这个问题听起来像是个难题(在创建连接之前不能传输端点,在拥有端点之前不能创建连接)。
解决方案(“诀窍”)是您需要一个中介进程(让我们称其为“基石”),该进程已经具有可以在其他两个进程之间交换端点的XPC连接。
在我的应用程序中,我最终创建了一个守护进程,作为我的基石,但我认为你可以直接在你的应用程序中完成。下面是你需要做的:
获取进程的侦听器对象:获取自动创建的服务侦听器(listener = NSXPCListener.serviceListener)或为第二个进程创建专用的、匿名的侦听器(使用listener = NSXPCListener.anonymousListener).
listener.endpoint)
[[NSXPCConnection alloc] initWithListenerEndpoint:aEndpoint]].创建到"A“的直接连接
发布于 2017-02-07 07:03:03
因此,我发现两个进程不可避免地无法与同一个XPCService通信。这是因为如果您尝试启动一个XPCService,它对于启动器来说将是一个独特的过程。据我所知,您只能与您的进程启动的XPCService通信。
因此,我相信您的第二个XPCService将无法“启动”第一个XPCService,因此将无法与其通信。
最好的办法可能是让第二个XPCService与主应用程序进程通信,然后主应用程序进程再与第一个XPCService通信。
你可以这样做:
[[self.firstXPCConnection remoteObjectProxy] getSomeString:^(NSString *myString) {
[[self.secondXPCConnection remoteObjectProxy] passSomeString:myString];
}];虽然是免责声明,但我还没有尝试过。但据我所知,我能帮你的最多
https://stackoverflow.com/questions/41566916
复制相似问题