【问题标题】:Running multiple instances of the same XPC service (NSXPCConnection)运行同一个 XPC 服务的多个实例 (NSXPCConnection)
【发布时间】:2012-12-11 17:25:53
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c cocoa xpc nsxpcconnection


    【解决方案1】:

    有点晚了,不过xpcservice.plistmanpage提供了这个问题的明确答案:

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

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

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

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

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

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

    【讨论】:

    • 那么 Safari 和 Chrome 是如何有多个助手的。他们是如何创造的?即使我需要多个助手代理,任何建议和帮助请...stackoverflow.com/questions/29680596/…
    • @AnoopVaidya 我不知道这个问题的答案。有可能它们只是作为孩子分叉而 Chrome 没有沙盒。
    • 感谢您的回复,我通过基于控制台的应用程序实现了它......并且该项目正在被成千上万的用户使用。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      由于 XPC 服务应该没有状态,所以不管一个或多个实例是否正在运行:

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

      ––Creating XPC Services

      将所有必要的状态信息放入 xpc 调用中,并将其返回给客户端(如果必须持久)。

      【讨论】:

      • 如果 XPC 服务使用插件架构来扩展功能并且应用程序作者出于安全(和其他)原因希望将每个调用分开,这很重要。一方面,我对无法定义 XPC 服务的多个实例感到失望。
      • 第二个实例如何提高安全性?
      • 如果插件被写成一个bundle(动态库)那么它可以访问整个过程。因此,最好让插件在各自的进程中彼此分开。
      • 如果有第二个实例,有一个向量不起作用,但只有一个实例?你能给我举个例子吗?
      • 我没有听懂你的问题。
      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-17
          • 1970-01-01
          • 2020-01-09
          • 2015-03-28
          • 1970-01-01
          相关资源
          最近更新 更多