从 XPC 服务创建 NSXPCConnection

Posted

技术标签:

【中文标题】从 XPC 服务创建 NSXPCConnection【英文标题】:Creating an NSXPCConnection from an XPC service 【发布时间】:2015-08-29 10:04:53 【问题描述】:

我正在尝试使用 XPC 服务“A”创建一个应用程序,该应用程序又尝试与 XPC 服务“B”进行通信。但是,它不起作用。

如果我将两个 XPC 服务复制到主应用程序中的 Contents/XPCServices,则 A 中的 NSXPCConnectioninvalidationHandler 会立即被调用,而 B 似乎根本没有启动。

如果我将嵌套的 XPC 服务复制到 Contents/XPCServices/A.xpc/Contents/XPCServices,那么它会启动 B,但它会立即崩溃:

Dyld Error Message:
  Library not loaded: @rpath/libswiftCore.dylib
  Referenced from: App.app/Contents/XPCServices/A.xpc/Contents/XPCServices/B.xpc/Contents/MacOS/B
  Reason: image not found

libswiftCore.dylib 存在于应用程序 A 和 B 的 Contents/Frameworks 文件夹中。

(我为Library not loaded: @rpath/libswiftCore.dylib 错误找到的其他建议没有帮助:更改代码签名身份,设置Runpath Search Paths。)

我做错了什么?

我知道我可以从主应用初始化与 B 的连接,然后将其作为 anonymousListener 传递给 A,但这听起来很难看。

【问题讨论】:

【参考方案1】:

@loader_path/../../../../Frameworks添加到B的Runpath Search Paths后,现在可以使用了。

【讨论】:

以上是关于从 XPC 服务创建 NSXPCConnection的主要内容,如果未能解决你的问题,请参考以下文章

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

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

我可以更改 XPC 服务的服务质量级别吗?

XPC 服务:提高工作线程上的堆栈大小

Xcode 5 上的 XPC 测试包

XPC 连接如何以线程方式处理?