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

时间:2013-06-23 18:06:51

标签: macos cocoa launchd xpc launch-agent

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

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

2 个答案:

答案 0 :(得分:4)

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

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

更新:正如Dmitry所说,我最初提到的示例不再附带文档,但App Sandbox的另一个Apple sample code project演示了相同的API(请参阅文件{ {1}})。

答案 1 :(得分:1)

文档页面现在不包含示例项目,因此它位于:http://rhult.github.io/articles/sandboxed-launch-on-login/