8

您将如何在沙箱中使用LaunchAgent?我想在我的主应用程序中分发一个无 UI 的 LaunchAgent 应用程序包,我可以按需启动它。我想要这个而不是 XPC 服务的原因是该KeepAlive选项,它可以防止launchd在空闲时自动杀死我的进程。XPC 服务上不存在此选项。

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

4

2 回答 2

4

您正在寻找的 API 是SMLoginItemSetEnabled(). 您必须将长期运行的代理打包为常规的 .app 包,并将其放入主应用程序的包中Content/Library/LoginItems

然后在主应用程序的运行时,您可以使用SMLoginItemSetEnabled()带有代理捆绑标识符的调用来启用和禁用您的代理。如果您的主应用程序退出,代理仍然存在。如果用户注销并重新登录或重新启动,操作系统将在用户重新登录时重新启动您的代理。

更新:正如 Dmitry 所指出的,文档不再包含我最初提到的示例,而是另一个 Apple示例代码项目,用于 App Sandbox,演示了相同的 API(请参阅文件NSXPCConnection+LoginItem.m)。

于 2013-08-19T17:03:38.740 回答
1

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

于 2015-04-18T19:36:14.367 回答