问题标签 [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 投票
1 回答
119 浏览

swift - 创建助手时发现的 Swift 问题

当我尝试为使用 system_profiler 命令检索系统软件和硬件详细信息的应用程序创建帮助程序时,出现以下错误。

来自 XPC 服务的响应:HELLO XPC
来自 XPC 服务的响应:/usr/sbin/system_profiler:/usr/sbin/system_profiler:无法执行二进制文件”

代码如下。

当我将 launchPath 设置为 /usr/sbin/system_profiler 时,我得到了空白输出。

0 投票
1 回答
656 浏览

objective-c - NSMachBootstrapServer 已弃用,如何使用 NSXPCConnection 注册 Mach 服务?

我需要编写一个我的应用程序和系统插件都可以与之通信的 Mach 服务,我使用NSMachPortAPI 创建一个新端口,然后将其注册到NSMachBootstrapServer

Clang 抱怨NSMachBootstrapServer已被弃用:

编写非 XPC mach 服务时如何使用NSXPCConnection来替换功能?NSMachBootstrapServer

0 投票
3 回答
1171 浏览

swift - 验证是否安装了帮助工具

我正在用 Swift 编写一个 macOS 应用程序,它需要一个特权帮助工具——希望提升不是必需的,但看起来它是.

我发现这个优秀的示例应用程序特别适合这种情况。我已经设法将它的代码移植到我自己的应用程序中,但我被困在需要检查是否安装了帮助工具的地方,如果没有,请使用SMJobBless()和朋友安装它。

运行示例应用程序时,如果未安装帮助工具,应用程序将停留在以下屏幕:

在此处输入图像描述

需要明确的是,通过阅读代码,我认为它应该在某个时候将标签更新为“Helper Installed:No”,但这似乎没有发生。

如果我单击“安装助手”,这就是结果。

在此处输入图像描述

从现在开始,除非我手动删除帮助工具,否则重新运行应用程序将显示此屏幕并显示“已安装帮助:是”。

在此示例情况下,此行为可能没问题,用户必须手动单击“安装助手”按钮。但是,在我的应用程序中,如果尚未安装,我希望它自动请求安装帮助工具。如果它已经安装,我不想浪费用户的时间再次请求他们的密码。

我认为这很简单:如果辅助工具不可用,在连接到它的过程中的某个地方,会发生错误,这是我请求安装该工具的触发器。如果没有发生错误,则假定该工具已安装。

这是我为通过 XPC 连接到帮助工具而编写的代码:

如果未安装帮助工具,则运行此代码不会产生错误或NSLog()输出。如果之后我通过 XPC(使用helper?.someFunction(...))调用函数,则什么也不会发生——我还不如与/dev/null.

现在,我只能摸不着头脑,寻找一种技术来检测是否安装了该工具。示例应用程序解决问题的方法是添加一个getVersion()方法;如果它返回某些内容,“Install Helper”将显示为灰色,并且标签更改为“Helper Installed: Yes”。

我想通过在我的工具中编写一个立即返回的简单函数来扩展这个想法,并在主应用程序中使用超时——如果我在代码超时之前没有得到结果,那么帮助工具可能不会安装。我发现这是一个 hacky 解决方案 - 例如,如果辅助工具(按需启动)启动时间过长,比如说因为计算机很旧并且用户正在运行 CPU 密集型的东西,该怎么办?

我看到了其他替代方法,例如在预期的位置 (/Library/PrivilegedHelperTools/Library/LaunchDaemons) 中查看文件系统,但是这个解决方案再次让我感到不满意。

我的问题:有没有办法明确检测特权 XPC 辅助工具是否在另一端监听?

我的环境:macOS Mojave 10.14.2、Xcode 10.1、Swift 4.2。

0 投票
1 回答
652 浏览

objective-c - XPC 和异常处理

我有一个使用HockeyApp进行崩溃报告的LaunchAgent 。现在我注意到HockeyApp没有报告未捕获的异常,就像它们在普通的 macOS 应用程序中一样。

例如:

永远不会到达NSUncaughtExceptionHandler,但控制台记录:

问题是如何使用HockeyApp报告未处理的异常。

0 投票
1 回答
997 浏览

objective-c - 如何在 XPC 服务中提供 Swift 类?

我正在尝试将 Apple 的 XPC“小写”示例代码从 Objective-C 重建为 Swift。我了解 XPC 会,但我对 Swift 和 Objective-C 互操作性还比较陌生。

当我使用他们的确切示例代码时,它将 aString从应用程序传递到目标并返回,它可以工作。但是当我尝试用我自己的自定义类替换它时Person,我得到了错误:

NSXPCConnection: ... 来自 pid 4133 的匿名侦听器或服务侦听器上的连接:

在解码接收到的选择器 upperCasePerson:withReply: 时捕获异常,丢弃传入消息。

异常:解码参数 0 时出现异常(调用#2):

例外:decodeObjectForKey:类“CombineCycle.Person”未加载或不存在。

(演示应用程序名称为“CombineCycle”)

Person是一个 Swift 类,它继承自NSObject并符合NSSecureCoding. 它有一个单一的属性name:String。它的随附.swift源文件包含在 XPC 目标的构建中。

该异常似乎不言自明,但我不确定我需要更改哪些构建设置,或者我需要生成哪些文件来解决潜在问题。

这只是一个演示应用程序。主应用程序是作为 Swift 应用程序创建的,不包含任何 Objective-C 文件。XPC 目标是使用 Xcode 的新目标特性创建的,该特性在 Xcode 11 中生成一个 Objective-C 骨架。我用 Swift 实现替换了所有这些文件。

更新

XPC 服务能够实例化一个实例Person就好了,所以该类被包含在内。问题似乎是NSXPCDecoder(私有类)无法反序列化它......

0 投票
2 回答
211 浏览

macos - 无法在 Launch 代理中连接到 XPCService

我创建了一个 XPC 服务。

服务器端代码简要地是

这是使用 info.plist 作为启动代理安装的

服务器运行良好,我可以看到它使用launchctl list运行

客户端代码在另一个应用程序中,连接代码是:

但无法连接到服务器。关于出了什么问题的任何指示?

0 投票
1 回答
84 浏览

xpc - 从 mac 移植到 linux/windows 并寻找一个跨平台的 XPC 等价物

我正在使用 XPC 并想移植到 linux/windows。寻找可以执行类似功能的替代方案。

有这样的吗?

0 投票
1 回答
64 浏览

objective-c - 重置/重新初始化 NSXPCConnection?

如果这是一个明显的问题,或者我在这里表现出完全缺乏知识(这是准确的),请提前抱歉。

  • 操作系统:macOS (10.12+)
  • IDE:Xcode (11)
  • 使用:Cococa + Objective-C

我们正在与 C API 交互。该 API 在后台存储各种会话/环境信息。有特定的 API 调用需要完全重新启动 API,但完成此操作的唯一方法是完全关闭调用它的客户端应用程序(API 的行为类似于单例,无法重新初始化自身)。

希望将 C API 包装在 XPC 服务中可以让我更优雅地关闭服务并重新启动它,这样我就可以避免重新启动整个客户端应用程序。

  1. 这是否是在 Cocoa 中思考这种需求的正确方式?
  2. 如果(如果)是,我将如何去做?我使用文件 -> 添加目标 -> XPC 服务向现有应用程序添加了一个简单的 XPC 服务。我可以调用 C API,所有工作都使用 NSXPCConnection 并从应用程序中点击适当的服务方法。不过,我对如何可能杀死/重新初始化 XPC 服务感到困惑。
  3. 有没有不同/更好的方法来看待这个?

欢迎任何方向/想法/批评

谢谢!

0 投票
0 回答
55 浏览

objective-c - 设计具有双向通信通道的 XPC 服务

我想实现某种配置管理器守护程序,它也用作XPCService以下接口 registerConfigProtocol。

协议方法上的处理程序参数应该是一个实现的代理类,setConfigureProtocol它将在 xpc 客户端中实现,这是接口:

当配置管理器决定新的配置文件可供客户端使用时,它将启动对setConfig上面的远程调用,该调用是处理程序实例中的一个方法。该调用预计将在客户端运行,该客户端是此新配置的消费者)。

所以我的目标是把它变成(id<setConfigureProtocol>)handler一个代理对象,我可以在新配置可用的异步事件上使用它。

我阅读了以下 API:

所以我在服务器 xpc 端做了这样的事情。据我了解,它应该使registerConfigWithHandler协议中方法的第一个参数configSetDelegateInterface是处理程序,一个代理对象。

所以现在我可以简单地从服务器端调用处理程序方法,以触发客户端每次可用时重新加载新配置?registerConfigWithHandler只要我希望服务器发起对客户端的调用,我就应该不返回吗?

谢谢 !

0 投票
1 回答
339 浏览

swift - macOS 上沙盒化 swift 应用的应用间通信

我正在使用 Swift 构建一个沙盒 macOS 应用程序,其中包含一个子应用程序。

我要实现的是:

  • 家长可以启动多个子应用
  • 家长向每个子应用发送不同的内容以显示
  • 父应用和子应用都有自己的 UI。

我一直在考虑的实现方式:

分布式通知

沙盒拒绝带有用户信息对象的分布式通知。

CFMessagePort

它要求父应用程序和子应用程序都在同一个应用程序组中,并使用适当的配置文件进行签名。但在 Xcode 上,它始终None required位于配置文件设置中,因此无处可更改设置。此外,没有文档或帖子解释如何在 Swift 中使用 CFMessagePort。我尝试了下面的代码,但每次都崩溃,因为它被沙盒拒绝。

NSXPC连接

我不认为 XPC 适用于这种情况,因为 XPC 旨在在运行不可见的服务和客户端应用程序之间进行通信,而服务被捆绑到应用程序中。我怀疑它是否适用于父子模型。


那么,有没有更好的方法来实现我的目标?我觉得我应该使用 CFMessagePort,但我还需要更多关于如何将它与 Swift 一起使用的帮助。谢谢!