问题标签 [nsxpcconnection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
3504 浏览

objective-c - 运行同一个 XPC 服务的多个实例 (NSXPCConnection)

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

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

0 投票
1 回答
1477 浏览

objective-c - 通过 NSXPCConnection 传递 xpc_object_t

我是 XPC 服务编程的新手,我正在尝试将在 XPC 服务中创建的 IOSurface 共享给主机应用程序。我可以使用 NSXPCConnection API 设置一个简单的主机和服务,现在我想我应该使用这两种方法(在IOSurfaceAPI.h中找到)将 IOSurface 传递给主机:

有没有办法可以使用 NSXPCConnection API 传递 xpc_object_t,还是应该使用 C API(如 xpc.h 中定义)?

0 投票
1 回答
907 浏览

objective-c - 混合 NSXPCConnection 和 xpc C API

我正在使用NSXPCConnection包装器处理 XPC 服务,并且由于 Objective-C 包装器无法处理IOSurfaceRef对象,我想对 xpc.h 中定义的 C API 进行一些直接函数调用。但是我找不到检索底层xpc_connection_t引用的方法(正如我在 NSXPCConnection.h 中看到的,有一个名为的私有 ivar_xconnection可能是我需要的引用)。我是否遗漏了一些愚蠢的东西,或者不能简单地将 Objective-C 包装器和 C API 一起使用?

0 投票
1 回答
5848 浏览

objective-c - NSXPCConnection 通过代理传递对象

Daemons and Services Programming Guides告诉我们可以通过打开的 XPC 连接返回代理对象,甚至作为回复块参数。

通过代理传递对象

大多数时候,复制对象并将它们发送到连接的另一端是有意义的。然而,这并不总是可取的。尤其:

如果您需要在客户端应用程序和助手之间共享数据的单个实例,则必须通过代理传递对象。如果一个对象需要调用应用程序中其他对象上的方法,而这些方法您不能或不希望通过连接传递(例如用户界面对象),那么您必须通过代理传递一个对象——调用者、被调用者(其中可能),或者您专门为此目的构建的中继对象。通过代理传递对象的缺点是性能显着降低(因为对对象的每次访问都需要进程间通信)。因此,如果无法通过复制传递对象,则应仅通过代理传递对象。

您可以配置其他代理对象,类似于配置初始连接的 remoteObjectInterface 属性的方式。首先,确定应该由代理传递方法的哪个参数,然后指定一个 NSXPCInterface 对象,该对象定义该对象的接口。

第一个问题来了:代理传递的对象应该如何定义?作为符合 NSXPCProxyCreating 协议的对象?那么是否应该实现 remoteObjectProxy 和 remoteObjectProxyWithErrorHandler: 方法?

下面是一个例子,这对我来说根本不清楚。特别是我不明白我应该在哪里调用 NSXPCInterface 方法 (setInterface:forSelector:argumentIndex:ofReply:) 将参数作为代理列入白名单:在 XPC 服务代码或主机中?

方法的第一个参数是参数 0,然后是参数 1,依此类推。

在这种情况下,为 ofReply 参数传递值 NO,因为此代码正在修改方法本身的参数之一的白名单。如果您将方法的回复块的参数的类列入白名单,请改为传递 YES。

所以问题是:任何人都可以为我提供一个关于如何在 XPC 方法调用的块回复中将对象作为代理返回的清晰教程吗?

0 投票
1 回答
562 浏览

objective-c - 带 XPC 的多用户核心数据

你好,

这是我的第一篇文章,所以如果这已经在某个地方得到了回答,请原谅我(我确实搜索过)。

问题:我有一个 Cocoa 应用程序需要在系统上的多个用户帐户之间共享一个 Core Data 数据库。

想法:我将创建一个守护进程来处理来自用户的请求(跨越用户权限边界)以保存/检索来自 Core Data 的数据。创建在应用程序中使用的共享托管对象上下文,并通过 NSXPCConnection 将该 MOC 传递给守护程序。守护进程将拥有一个完全实现的核心数据堆栈。然后,我可以将在应用程序中创建的 MOC 设置为由守护程序创建的 MOC 的子级。点击保存,我就完成了?

问题:这甚至会起作用吗?这只是一个愚蠢的想法吗?其他解决方案是什么?NSManagedObjectContext 符合 NSCoder 协议,但是为了将它与 XPC 一起使用,我必须对其进行子类化并使其符合 NSSecureCoding 协议?我是否还需要确保我的 ManagedObject 子类符合 NSSecureCoder 协议才能与 NSXPConnection 一起使用?我想我可以一起放弃上下文,只发送托管对象。

我假设 NSXPCConnection 复制对象而不是使用指针?这个对吗?此外,我可能必须牢记性能,因为对象被编码/解码为完全实现的对象并且没有错误。这个对吗?

预先感谢您的帮助。

0 投票
3 回答
5463 浏览

objective-c - XPC 未正确注册类以进行收集

我在 10.8 上的一个应用程序中使用 XPC。它具有为导出接口和远程接口定义的协议的标准设置。我遇到的问题是我在导出接口上的一种方法。

我有一个模型类,我们就叫它吧Foo。此类符合NSSecureCoding、实现+supportsSecureCoding和使用安全编码方法正确编码/解码内部属性。当通过我的导出接口上的仅涉及单个实例的方法传递此对象时,它可以正常工作。

当我想传递这些对象的集合或对象时,就会出现NSArray问题Foo。这是导出界面上签名的示例:

Foo如文档中所述,我已将课程列入白名单:

现在这应该可以使这个数组可以安全地跨进程复制并在另一端解码。不幸的是,这似乎没有按预期工作。

在导出的协议上调用该方法时,我收到一个异常:

警告:在解码收到的对消息“grabSomethingWithCompletion:”的回复、丢弃传入消息和调用失败块时捕获异常。

异常:解码调用参数 1 时出现异常:返回值:{v} void 目标:{@?} 0x0(块)参数 1:{@} 0x0

例外:键“NS.objects”的值是意外的“Foo”类。允许的类是'{( NSNumber, NSArray, NSDictionary, NSString, NSDate, NSData )}'。

这似乎甚至没有注册我之前执行的白名单。有什么想法吗?

0 投票
1 回答
448 浏览

objective-c - 有没有办法通过 XPC 传递任意结构?

我希望我的 Cocoa 应用程序与数据库服务器进行通信。按照应用程序沙盒设计的原则,将数据库通信拆分为 XPC 服务是有意义的。

由于 XPC 服务应该是无状态的,因此包含连接信息的结构(例如MySQL 连接句柄)需要由主应用程序持有并根据需要传递给 XPC 服务。然而,句柄是一种不透明的类型,XPC 服务似乎不支持它——只允许基本的算术/逻辑/集合类型。

是否有某种方法可以将连接句柄(或其他不透明类型)装箱,以便可以将其传递给 XPC 服务?

0 投票
1 回答
3356 浏览

objective-c - 当 launchd 终止进程时是否调用 XPC 中断处理程序?

interruptionHandler状态块的文档NSXPCConnection

远程进程退出或崩溃时调用的中断处理程序。

但是,守护进程和服务编程指南指出:

XPC 服务由 launchd 管理,它按需启动它们,如果它们崩溃则重新启动它们,并在它们空闲时终止它们(通过发送 SIGKILL)。这对使用该服务的应用程序是透明的,除非服务在处理需要响应的消息时崩溃。在这种情况下,应用程序可以看到它的 XPC 连接已经失效,直到服务被 launchd 重新启动

如果 XPC 进程因空闲而被杀死,我会在我的interruptionHandler? 或者我只会在应用程序在处理消息时崩溃时收到回调?我问是因为这个测试用例似乎无法模拟。不幸的是,XPC 服务生命周期是一个非常黑的盒子。

0 投票
1 回答
296 浏览

macos - 使用 XPC 并行化 Cocoa WebView 渲染

我的 Cocoa 应用需要同时渲染多批生成的网页。由于 WebKit WebView 渲染仅限于主线程,我不能在应用程序的进程中使用 GCD 来执行此操作,因此我正在考虑使用某种进程间解决方案。

NSXPCConnection是显而易见的选择,因为它与沙箱配合得很好,并且透明地代理了我需要使用的所有核心基础类型。但是,它似乎只为每个服务创建一个进程,这只是将我的主线程限制移动到另一个进程中,并且不允许我并行化多个渲染请求。有没有办法说服 XPC 系统为同一个服务分叉多个进程,可能使用 C API(xpc_connection_create等)?

在这一点上,我正在考虑制作一打XPCServices具有不同名称的相同捆绑包,并连接到对于特定批次的并行渲染请求空闲的捆绑包,但这似乎很愚蠢。

0 投票
1 回答
8110 浏览

macos - 如何从 XPC 助手应用程序向主应用程序发送消息?

通过从主应用程序发送消息,我成功地创建了 XPC 服务并与 XPC 服务通信。但我想知道的是,是否可以启动从 XPC 服务到主应用程序的通信。Apple 文档说 XPC 是双向的。如果有人能用一个例子指出我正确的方向,将不胜感激。

请注意,

  • 我想从主应用程序启动 XPC。
  • 从主应用程序与 XPC 通信。
  • 当某些事件发生时,XPC 应该向主应用程序发送消息。

我在前两个中成功了,但在第三个中找不到任何资源。

谢谢。:)