适用于GUI应用程序的LaunchAgent

时间:2010-09-19 20:24:00

标签: macos autostart

我想在每次用户登录时启动我的应用程序。

我将plist文件添加到/ Libray / LaunchAgents文件夹:

<?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>KeepAlive</key>
 <false/>
 <key> LaunchOnlyOnce</key>
 <true/>
 <key>OnDemand</key>
 <false/>
 <key>RunAtLoad</key>
 <true/>
 <key>Label</key>
 <string>com.mycompany.myapp</string>
 <key>ProgramArguments</key>
 <array>
  <string>/Applications/mayapp.app/Contents/MacOS/myapp</string>
 </array>
</dict>
</plist>

所有看起来都好,正在加载应用程序,但是当我退出我的应用程序时,它是由launchd服务启动的。

我必须在plist文件中添加/修改哪个键,以防止我的应用程序不断重新启动。

3 个答案:

答案 0 :(得分:2)

如果要在登录时启动常规应用程序,我建议使用LaunchServices共享文件列表API而不是launchd。您可以使用此API将应用程序添加到用户的登录项(您在“系统偏好设置”的“帐户首选项”窗格中看到的项目),而不必安装启动的plist。这样做的好处是:a)用户更明显的原因是应用程序在登录时启动,b)用户更容易删除它,以及c)如果用户删除你的应用程序,launchd会向控制台报错当它无法启动(现在缺少的)应用程序时。

似乎没有任何API的参考文档,但相关的函数可以在LSSharedFileList.h中找到。这个代码看起来像这样:

#import <CoreServices/CoreServices.h>

...

LSSharedFileListRef loginItemList = LSSharedFileListCreate(kCFAllocatorDefault, kLSSharedFileListSessionLoginItems, NULL);
if (loginItemList != NULL)
{
    LSSharedFileListRef myItem = LSSharedFileListInsertItemURL(loginItemList, kLSSharedFileListItemLast, NULL, NULL, (CFURLRef)[[NSBundle mainBundle] bundleURL], NULL, NULL);
    //We don't do anything with the new item, but we need to release it so it doesn't leak
    if (myItem != NULL)
        CFRelease(myItem);
    CFRelease(loginItemList);
}

如果您希望为所有用户而不仅仅是当前登录的用户启动此项,则可以使用kLSSharedFileListGlobalLoginItems而不是kLSSharedFileListSessionLoginItems。

答案 1 :(得分:0)

我看到两个问题:主要问题是你有<key>OnDemand</key><false/>,它告诉launchd代理需要我保持活着(这似乎是重写<key>KeepAlive</key><false/>,这意味着正好相反)。第二个问题是您在<key> LaunchOnlyOnce</key><true/>中的密钥名称前面有一个空格。简单的解决方案:删除OnDemand和LaunchOnlyOnce键,它应该可以正常工作。

答案 2 :(得分:0)

删除Keep Alive键并仅启动一次键...因为您只需要启动一次应用程序。以下是启动名为登录应用程序的应用程序的示例代码。

<?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>RunAtLoad</key>
<true/>
<key>Label</key>
<string>com.apple.LoginApp</string>
<key>Program</key>
<string>/Library/Log Files/LoginApp.app/Contents/MacOS/LoginApp</string>
<key>onDemand</key>
<false/>
</dict>
</plist>

希望这有帮助