在 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服务支持多种协议

服务和客户端应用程序之间的 XPC 通信仅在从 xcode 启动时才有效

在我的 Swift 应用程序中使用来自 XPC 服务的 Objective-C 协议

Xcode 5 上的 XPC 测试包

XPC 服务未从 Xcode 源代码编辑器扩展启动(`仍然很忙`)

如何在 Xcode 4.5“命令行工具”项目中设置工作逻辑单元测试目标?