在 Xcode 中添加命令行目标作为 XPC 服务器的功能
Posted
技术标签:
【中文标题】在 Xcode 中添加命令行目标作为 XPC 服务器的功能【英文标题】:Add commandline target in Xcode the ability to function as XPC server 【发布时间】:2021-05-12 11:45:20 【问题描述】:我目前有来自类型命令行工具的目标,它使用/Library/LaunchDaemons
下的 plist 文件作为守护进程运行。
现在我需要为它添加从我拥有的另一个进程接收 XPC 消息的功能。这个 Macho 文件是独立的,在 Resources
子文件夹中的应用程序包下运行。
我添加并实现了如下接口,并从main
方法中调用,但是够了吗?
@interface ServiceDelegate : NSObject <NSXPCListenerDelegate>
ServiceDelegate *delegate = [ServiceDelegate new];
NSXPCListener *listener = [[NSXPCListener alloc] initWithMachServiceName:@"com.macho.scanner"];
[listener resume];
[[NSRunLoop mainRunLoop] run];
问题是我是否可以修改我的命令行目标并添加 XPC 服务器,或者我是否需要从 XPC 服务类型创建新目标并将其作为守护进程运行?
谢谢
【问题讨论】:
【参考方案1】:您应该能够将 XPC 服务器添加到您的 cmd 目标。
这需要两件事:
添加运行服务器所需的代码。我为此使用 C API,但 Objective-C 应该是一样的。我会添加到您的代码中,至少将委托设置为侦听器。
在launch.plist 中声明你想要一些mach 服务。它看起来像:
<key>MachServices</key>
<dict>
<key>com.macho.scanner</key>
<true/>
</dict>
还要注意:你的守护进程在根命名空间下运行,命名空间就像堆栈,根在底部。用户应用可以看到您的守护进程 mach 端点并建立与它的连接,但反之亦然。
【讨论】:
以上是关于在 Xcode 中添加命令行目标作为 XPC 服务器的功能的主要内容,如果未能解决你的问题,请参考以下文章
服务和客户端应用程序之间的 XPC 通信仅在从 xcode 启动时才有效
在我的 Swift 应用程序中使用来自 XPC 服务的 Objective-C 协议