是否可以使用Foundation.framework(NSXPCConnection
等)中的XPC API运行同一XPC服务的多个实例? docs并未对此事提供太多见解。
编辑:进行了快速测试,即使我创建了两个XPC连接,似乎只有一个服务实例正在运行。是否有任何方式让它运行另一个实例?
答案 0 :(得分:8)
有点晚了,但xpcservice.plist
manpage提供了对此问题的明确答案:
ServiceType(默认值:应用程序)
XPC服务的类型指定了如何实例化服务。 值为:
•应用程序:每个应用程序都有一个唯一的此服务实例。
•用户:为每个用户创建了一个服务流程实例。
•系统:整个系统有一个服务流程实例。系统XPC服务仅限于驻留在系统框架中,并且必须由root拥有。
结论:在大多数情况下,只有XPC服务的单个实例,并且只有在不同应用程序可以连接到同一服务的情况下(当服务与应用程序捆绑在一起时甚至不可能),会有多个实例(每个应用程序一个实例)。
答案 1 :(得分:1)
我相信XPC服务是针对每个多个连接的一个实例而设计的。或许,使用一个正在运行的可执行文件管理命名管道会更方便。因此,最有可能无法同时创建多个实例。
答案 2 :(得分:0)
由于XPC服务应该没有状态,因此无论是否有一个或多个实例正在运行,这都无关紧要:
XPC服务由launchd管理,它按需启动它们,如果它们崩溃则重新启动它们,并在它们空闲时终止它们(通过发送
SIGKILL
)。这对使用该服务的应用程序是透明的,除了在处理需要响应的消息时崩溃的服务的情况。在这种情况下,应用程序可以看到,在launchd重新启动服务之前,其XPC连接已无效。因为XPC服务可以在任何时候突然终止,它必须设计为保持最小状态 - 理想情况下,您的服务应该是完全无状态的,尽管这并不总是可行。
将所有必要的状态信息放入xpc调用并将其传递回客户端(如果必须持续存在)。
答案 3 :(得分:0)
XPCService词典中的ServiceType键:应用程序或用户或系统
但是这个'ServiceType'是无关紧要的......如果服务嵌入在应用程序包中,那么它只对包含的应用程序可见,并且根据定义,它将是Applicaton类型的服务。从应用程序到服务的后续连接请求将导致与现有服务的新连接。
答案 4 :(得分:0)
我知道我迟到了,虽然你不能用普通的XPC做到这一点, 这个库(OpenEmu的一个组件)应该能够满足您的要求:OpenEmuXPCCommunicator