使用 XPC 创建守护进程/UI 连接

Creating Daemon / UI connection using XPC

我的平台包含基于混合 c++/objective-c 代码的系统级守护进程,由 launchd 根据位于 /Library/LaunchDaemons/ 中的具有适当配置的 plist 文件运行。

另一方面,它包含使用故事板构建的基于 UI 的应用程序,该应用程序从后台运行并定义为 LaunchAgent(这意味着它也由 launchd 使用 plist 文件操作在 /Library/LaunchAgents/)

现在我希望在它们之间建立单向连接,以便守护进程可以发送消息以供 UI 应用程序显示。消息可以包含 strings/numbers 或任何其他可显示的数据。

我已经检查了使用 XPC 连接的选项,并将 NSXPCConnection 添加到我的守护程序中,该守护程序与使用 NSXPCListener 在 UI 端实现的服务器共享专用协议。

我很乐意收到关于我的设计的评论和建议,尤其是在以下方面

1. Should I implement the UI as launchAgent 
(I need to support multi-users, meaning that the daemon can send
different messages to each UI instance per user) 

.

2. should I consider using dedicated `XPC service`. 
Seems like Xcode has option to create XPC service, 
but I don't know how should I "attach" the UI code inside ... 

.

3. is it possible to have XPC client which runs objective-c 
code while the XPC listener will run on swift code ? 

谢谢

我认为您应该阅读 Apple 的守护进程和服务编程指南:https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/Introduction.html#//apple_ref/doc/uid/10000172i-SW1-SW1

  1. UI 可能应该作为与守护进程通信的常规应用程序来完成。

  2. 我认为 XPC 服务不能满足您的需求,因为您说您需要支持多个用户。

an XPC service is private, and is available only to the main application that contains it.

  1. 是的。 NSXPCConnection class 是您可能会使用的,它可以在 Foundation 中找到,它与 Swift 和 Objective-C.
  2. 兼容
  1. 将 UI 应用程序实现为常规应用程序或启动代理并不重要。选择更适合的。
  2. 您是否正在考虑拥有 UI 应用程序和 XPC 服务?这应该有效。
  3. 它适用于 Swift、Objective-C 和混合语言项目。

Now I wish to establish a uni directional connection between them so that the Daemon can send messages to be displayed by the UI application.

它对我不起作用。根进程无法初始化与用户进程的通信。但反之亦然:如果连接由 UI 发起(您在 UI 中实例化 NSXPCConnection,并在 Daemon 中实例化一个侦听器)。