15

是否可以使用 Foundation.framework (NSXPCConnection等) 中的 XPC API 运行同一 XPC 服务的多个实例?文档没有提供关于这个问题的太多见解。

编辑:做了一个快速测试,似乎只有一个服务实例在运行,即使我创建了两个 XPC 连接。有没有办法让它运行另一个实例?

4

5 回答 5

8

xpcservice.plist 有点晚了,但手册页中提供了这个问题的明确答案:

服务类型(默认:应用程序)

XPC 服务的类型指定服务的实例化方式。这些值为:

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

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

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

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

于 2014-04-14T13:28:17.017 回答
1

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

于 2012-12-26T07:32:05.857 回答
0

由于 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 调用并将其返回给客户端(如果必须保持)。

于 2013-05-06T19:43:11.160 回答
0

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

XPCService 字典中的 ServiceType 键:Application 或 User 或 System

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

于 2015-03-28T10:17:32.033 回答
0

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

于 2016-02-26T08:11:38.367 回答