我想在每次用户登录时启动我的应用程序。
我将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文件中添加/修改哪个键,以防止我的应用程序不断重新启动。
答案 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>
希望这有帮助