使用 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
UI 可能应该作为与守护进程通信的常规应用程序来完成。
我认为 XPC 服务不能满足您的需求,因为您说您需要支持多个用户。
an XPC service is private, and is available only to the main application that contains it.
- 是的。 NSXPCConnection class 是您可能会使用的,它可以在 Foundation 中找到,它与 Swift 和 Objective-C.
兼容
- 将 UI 应用程序实现为常规应用程序或启动代理并不重要。选择更适合的。
- 您是否正在考虑拥有 UI 应用程序和 XPC 服务?这应该有效。
- 它适用于 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 中实例化一个侦听器)。
我的平台包含基于混合 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
UI 可能应该作为与守护进程通信的常规应用程序来完成。
我认为 XPC 服务不能满足您的需求,因为您说您需要支持多个用户。
an XPC service is private, and is available only to the main application that contains it.
- 是的。 NSXPCConnection class 是您可能会使用的,它可以在 Foundation 中找到,它与 Swift 和 Objective-C. 兼容
- 将 UI 应用程序实现为常规应用程序或启动代理并不重要。选择更适合的。
- 您是否正在考虑拥有 UI 应用程序和 XPC 服务?这应该有效。
- 它适用于 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 中实例化一个侦听器)。