运行相同XPC服务的多个实例(NSXPCConnection)

时间:2012-12-26 03:41:47

标签: objective-c cocoa xpc nsxpcconnection

是否可以使用Foundation.framework(NSXPCConnection等)中的XPC API运行同一XPC服务的多个实例? docs并未对此事提供太多见解。

编辑:进行了快速测试,即使我创建了两个XPC连接,似乎只有一个服务实例正在运行。是否有任何方式让它运行另一个实例?

5 个答案:

答案 0 :(得分:8)

有点晚了,但xpcservice.plist manpage提供了对此问题的明确答案:

  

ServiceType(默认值:应用程序)

     

XPC服务的类型指定了如何实例化服务。   值为:

     

•应用程序:每个应用程序都有一个唯一的此服务实例。

     

•用户:为每个用户创建了一个服务流程实例。

     

•系统:整个系统有一个服务流程实例。系统XPC服务仅限于驻留在系统框架中,并且必须由root拥有。

结论:在大多数情况下,只有XPC服务的单个实例,并且只有在不同应用程序可以连接到同一服务的情况下(当服务与应用程序捆绑在一起时甚至不可能),会有多个实例(每个应用程序一个实例)。

答案 1 :(得分:1)

我相信XPC服务是针对每个多个连接的一个实例而设计的。或许,使用一个正在运行的可执行文件管理命名管道会更方便。因此,最有可能无法同时创建多个实例。

答案 2 :(得分:0)

由于XPC服务应该没有状态,因此无论是否有一个或多个实例正在运行,这都无关紧要:

  

XPC服务由launchd管理,它按需启动它们,如果它们崩溃则重新启动它们,并在它们空闲时终止它们(通过发送SIGKILL)。这对使用该服务的应用程序是透明的,除了在处理需要响应的消息时崩溃的服务的情况。在这种情况下,应用程序可以看到,在launchd重新启动服务之前,其XPC连接已无效。因为XPC服务可以在任何时候突然终止,它必须设计为保持最小状态 - 理想情况下,您的服务应该是完全无状态的,尽管这并不总是可行。

- Creating XPC Services

将所有必要的状态信息放入xpc调用并将其传递回客户端(如果必须持续存在)。

答案 3 :(得分:0)

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/xpcservice.plist.5.html

XPCService词典中的ServiceType键:应用程序或用户或系统

但是这个'ServiceType'是无关紧要的......如果服务嵌入在应用程序包中,那么它只对包含的应用程序可见,并且根据定义,它将是Applicaton类型的服务。从应用程序到服务的后续连接请求将导致与现有服务的新连接。

答案 4 :(得分:0)

我知道我迟到了,虽然你不能用普通的XPC做到这一点, 这个库(OpenEmu的一个组件)应该能够满足您的要求:OpenEmuXPCCommunicator