在Mac应用程序沙箱中使用LaunchAgent

问题描述 投票:0回答:2

如何在沙箱内使用LaunchAgent?我想在我的主应用程序中分发一个无 UI LaunchAgent 应用程序包,我可以按需启动它。我想要这个而不是 XPC 服务的原因是为了

KeepAlive
选项,这将阻止
launchd
在空闲时自动终止我的进程。 XPC 服务上不存在此选项。

文档说有一个plist需要复制到

~/Library/LaunchAgents
中,而这在沙箱内显然是不可能的。是否有某种系统 API 可以为我处理 plist 的复制?我看过 Apple 的 SMJobBless 示例代码,但它似乎是用于注册特权 LaunchDaemon 而不是非特权 LaunchAgent。

macos cocoa launchd xpc launch-agent
2个回答
4
投票

您正在寻找的 API 是

SMLoginItemSetEnabled()
。您必须将长期运行的代理打包为常规 .app 捆绑包,并将其放入主应用程序的捆绑包中,位置为
Content/Library/LoginItems

然后在主应用程序运行时,您可以使用

SMLoginItemSetEnabled()
调用和代理的捆绑包标识符来启用和禁用代理。如果您的主应用程序退出,代理仍保持活动状态。如果用户注销并重新登录或重新启动,操作系统将在用户重新登录时重新启动您的代理。

更新: 正如 Dmitry 所指出的,文档不再附带我最初提到的示例,但另一个 Apple 示例代码项目(针对 App Sandbox)演示了相同的 API(请参阅文件

NSXPCConnection+LoginItem.m
)。

2023 年 12 月更新:当前文档表示 SMLoginItemSetEnabled 已弃用。推荐的替代品是 SMAppService,它具有 registerunregister 方法。引用那里:

在 macOS 13 及更高版本中,使用 SMAppService 来注册和控制 LoginItems、LaunchAgents 和 LaunchDaemons 作为应用程序的帮助程序可执行文件。


1
投票

文档页面现在不包含示例项目,所以这里是:http://rhult.github.io/articles/sandboxed-launch-on-login/

© www.soinside.com 2019 - 2024. All rights reserved.