是否可以使用 Foundation.framework (NSXPCConnection
等) 中的 XPC API 运行同一 XPC 服务的多个实例?文档没有提供关于这个问题的太多见解。
编辑:做了一个快速测试,似乎只有一个服务实例在运行,即使我创建了两个 XPC 连接。有没有办法让它运行另一个实例?
是否可以使用 Foundation.framework (NSXPCConnection
等) 中的 XPC API 运行同一 XPC 服务的多个实例?文档没有提供关于这个问题的太多见解。
编辑:做了一个快速测试,似乎只有一个服务实例在运行,即使我创建了两个 XPC 连接。有没有办法让它运行另一个实例?
xpcservice.plist
有点晚了,但手册页中提供了这个问题的明确答案:
服务类型(默认:应用程序)
XPC 服务的类型指定服务的实例化方式。这些值为:
• 应用程序:每个应用程序都将具有该服务的唯一实例。
• 用户:为每个用户创建一个服务流程实例。
• 系统:整个系统有一个服务进程实例。系统 XPC 服务仅限于驻留在系统框架中,并且必须由 root 拥有。
底线:在大多数情况下,XPC 服务只有一个实例,并且只有在不同的应用程序可以连接到同一个服务的情况下(甚至在服务与应用程序捆绑时也不可能),才会有多个实例(一个-每个应用程序的实例)。
我相信 XPC 服务是为每个多个连接的一个实例设计的。也许,使用一个正在运行的可执行文件来管理命名管道会更方便。因此,最有可能同时创建多个实例是不可能的。
由于 XPC 服务应该没有状态,所以一个或多个实例是否正在运行并不重要:
XPC 服务由 launchd 管理,它按需启动它们,如果它们崩溃则重新启动它们,并
SIGKILL
在它们空闲时终止它们(通过发送 )。这对使用该服务的应用程序是透明的,除非服务在处理需要响应的消息时崩溃。在这种情况下,应用程序可以看到它的 XPC 连接已经失效,直到服务被 launchd 重新启动。因为 XPC 服务可以随时突然终止,所以它必须设计为保持最小状态——理想情况下,您的服务应该是完全无状态的,尽管这并不总是可能的。
–– <a href="https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html" rel="nofollow">创建 XPC 服务
将所有必要的状态信息放入 xpc 调用并将其返回给客户端(如果必须保持)。
XPCService 字典中的 ServiceType 键:Application 或 User 或 System
但是这个“ServiceType”是无关紧要的……如果服务嵌入在一个应用程序包中,那么它只会对包含的应用程序可见,并且根据定义,它将是应用程序类型的服务。从应用程序到服务的后续连接请求将导致与现有服务的新连接。
我知道我迟到了,但是虽然你不能用普通的 XPC 做到这一点,但有一个库(OpenEmu 的一个组件)应该能够满足你的要求:OpenEmuXPCCommunicator