可可-如何使非沙盒macOS应用在登录时启动?

时间:2019-05-25 03:28:41

标签: macos cocoa launchd launch-agent

我正在开发一个不会在App Store中发布的非沙盒macOS应用程序,我想让该应用程序在用户登录时运行。

我发现的当前方法是使用Service Management框架和一个辅助应用程序,该应用程序需要对此应用程序进行签名。以前的有效方法是LSSharedFileList,但此方法在macOS 10.14中不起作用。

有没有办法让这个简单的应用程序从登录开始?

1 个答案:

答案 0 :(得分:0)

您可以向launched注册任何应用,以作为用户代理运行。

在此示例中,只要用户登录,就会启动名为On Startup的应用。

第1步

您需要创建一个“ launchd.plist”文件来描述该服务。在此示例中,您将创建一个名为com.yourdomain.onstartup.plist的文件,其内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.yourdomain.onstartup</string>
    <key>LimitLoadToSessionType</key>
    <string>Aqua</string>
    <key>Program</key>
    <string>/Applications/On Startup.app/Contents/MacOS/On Startup</string>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

关键点是RunAtLoad属性,该属性指示在用户会话加载时启动的启动进程。

(注意:您可以通过构建字典并将其写为属性列表来创建此文件。)

第2步:

将该文件安装在~/Library/LaunchAgents中。启动是在这里查找每个用户启动的配置文件。

第3步:

执行命令

launchctl bootstrap ~/Library/LaunchAgents/com.yourdomain.onstartup.plist

或者只是等到系统重新启动。

bootstrap命令告诉启动项,新服务要立即注册并激活,但是LaunchAgents中的所有文件将在用户下次登录时自动注册。

如果您需要始终运行应用程序,请考虑添加KeepAlive属性。还有大约十亿其他选择。

第4步:

要阻止您的应用在登录时再次启动,请删除com.yourdomain.onstartup.plist文件。

如果设置了KeepAlive属性,则还需要调用launchctl bootout gui/501/com.yourdomain.onstartup命令来停止该服务并立即取消注册。 (注意:这会杀死您的应用。)

请参见

man launchd.plist

man launchctl

macOS Daemons and Services