问题标签 [xpc]

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 投票
0 回答
61 浏览

cocoa - 如何从浏览器中获取选定的 HTML 并拉入我的应用程序

我想创建一个 Cocoa 应用程序,它能够从第三方浏览器中的网站中获取选定的文本(换句话说,不是从我自己的应用程序中运行的嵌入式 webkit 实例),然后将其存储在我的应用程序的数据库中. 据我所知,我需要为此使用某种服务,例如如何通过服务将 Textedit 中的选定文本转换为新的便签。但是,我希望能够通过 App Store 提供这个应用程序。这是否意味着我需要使用 XPC 服务?

这就是我所得到的。因此,如果我确实需要使用 XPC 服务,有人可以指点我一个有用的方向吗?服务实施指南完全超出了我的想象。

0 投票
1 回答
729 浏览

macos - 你可以在插件中运行 XPC 服务吗?(例如打印对话框扩展插件)

我正在创建一个打印对话框扩展 (PDE) 插件。当用户从不同的应用程序(例如 TextEdit、Preview、Xcode 等)进行打印时,会调用并显示此插件。请注意,该插件运行在调用打印插件(例如,TextEdit)的应用程序之上。

在插件内部,我需要运行 XPC 服务。我需要 XPC 服务,因为主应用程序上的权利可能不足以满足我的需求,例如我需要连接到网络,而 TextEdit 没有网络连接所需的权利。

问题是,我无法创建 XPC 连接。处理程序总是以 XPC_ERROR_CONNECTION_INVALID 触发。

1.) 这是因为 PDE 插件不在主包/主应用程序中,例如文本编辑?
2.) 如果是,我怎样才能在 PDE 插件中运行 XPC 服务?
3.) 如果没有,那为什么我不能成功创建 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 投票
2 回答
1814 浏览

macos - 在 Mac 应用程序沙箱中使用 LaunchAgent

您将如何在沙箱中使用LaunchAgent?我想在我的主应用程序中分发一个无 UI 的 LaunchAgent 应用程序包,我可以按需启动它。我想要这个而不是 XPC 服务的原因是该KeepAlive选项,它可以防止launchd在空闲时自动杀死我的进程。XPC 服务上不存在此选项。

文档说有一个 plist 需要复制到~/Library/LaunchAgents中,这在沙箱中显然是不可能的。是否有某种系统 API 可以为我处理 plist 的复制?我看过 Apple 的SMJobBless示例代码,但这似乎是用于注册特权 LaunchDaemon 而不是非特权 LaunchAgent。

0 投票
2 回答
613 浏览

ios - 当取消处理程序引用自身时,在 -dealloc 中取消 XPC 连接

在我的项目中,我使用基于 C 的 XPC API,因为 NSXPCConnection 在我的目标平台上不可用。目前我使用弱引用来防止连接处理程序块保留self,如下:

-dealloc但是,每当在我的类的方法中取消连接时,就会引入一个问题:

因为取消 XPC 连接是一个异步操作,所以在类实例已经被释放后调用连接处理程序,导致proxy指向一个不再存在的对象。

有没有一种方法可以安全地取消连接-dealloc并让连接处理程序在取消后调用委托方法?

0 投票
1 回答
277 浏览

objective-c - 采用不透明类型的 NSSecureCoding

我有一个需要采用NSSecureCoding跨 XPC 连接进行传输的 Objective-C 类。该类有几个不透明类型的属性(dispatch_queue_tdispatch_group_t)。

-initWithCoder:在这种情况下,我将如何实施-encodeWithCoder:?文档说这些是类似对象的结构,所以我假设在编码/解码时需要将它们转换为原始字节/从原始字节转换?如果是这种情况,我不确定应该使用哪些方法来做到这一点。另一种选择是完全避免对它们进行编码并在内部重新创建它们-initWithCoder:

0 投票
0 回答
99 浏览

macos - 我的服务器应用程序没有响应任何请求

我编写了一个响应 http 请求的简单服务器。服务器基于 CFSocket。当应用程序独立运行时,一切正常。

但现在我将其重写为 LaunchAgent 应用程序。我使用 XPC 与另一个进程通信。

进程之间的这种通信有效,但我的服务器没有响应此套接字上的连接。

LaunchAgent plist 如下所示:

我错过了什么?