如何在沙箱内使用LaunchAgent?我想在我的主应用程序中分发一个无 UI LaunchAgent 应用程序包,我可以按需启动它。我想要这个而不是 XPC 服务的原因是为了
KeepAlive
选项,这将阻止 launchd
在空闲时自动终止我的进程。 XPC 服务上不存在此选项。
文档说有一个plist需要复制到
~/Library/LaunchAgents
中,而这在沙箱内显然是不可能的。是否有某种系统 API 可以为我处理 plist 的复制?我看过 Apple 的 SMJobBless 示例代码,但它似乎是用于注册特权 LaunchDaemon 而不是非特权 LaunchAgent。
SMLoginItemSetEnabled()
。您必须将长期运行的代理打包为常规 .app 捆绑包,并将其放入主应用程序的捆绑包中,位置为 Content/Library/LoginItems
。
然后在主应用程序运行时,您可以使用
SMLoginItemSetEnabled()
调用和代理的捆绑包标识符来启用和禁用代理。如果您的主应用程序退出,代理仍保持活动状态。如果用户注销并重新登录或重新启动,操作系统将在用户重新登录时重新启动您的代理。
更新: 正如 Dmitry 所指出的,文档不再附带我最初提到的示例,但另一个 Apple 示例代码项目(针对 App Sandbox)演示了相同的 API(请参阅文件
NSXPCConnection+LoginItem.m
)。
2023 年 12 月更新:当前文档表示 SMLoginItemSetEnabled 已弃用。推荐的替代品是 SMAppService,它具有 register 和 unregister 方法。引用那里:
在 macOS 13 及更高版本中,使用 SMAppService 来注册和控制 LoginItems、LaunchAgents 和 LaunchDaemons 作为应用程序的帮助程序可执行文件。
文档页面现在不包含示例项目,所以这里是:http://rhult.github.io/articles/sandboxed-launch-on-login/