2010-09-19 109 views
0

我想每次用戶登錄時啓動我的應用程序。LaunchAgent for GUI應用程序

我添加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> 

一切看起來OK,應用程序被加載,但是當我離開我的應用程序是通過的launchd服務推出回來。

我應該在我的plist文件中添加/修改哪個鍵,以防止我的應用程序不斷重新啓動。

回答

2

如果您想在登錄時啓動常規應用程序,我建議使用LaunchServices共享文件列表API而不是launchd。您不必安裝啓動的plist,只需使用此API將應用程序添加到用戶的登錄項目(在「系統預置」的「帳戶」前面窗格中看到的項目)即可。這樣做的好處是: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,而不僅僅是當前登錄的用戶。

+0

顯然kLSSharedFileListSessionLoginItems被棄用(OS X 10.11)已經和蘋果公司建議,使用發射劑是一種更好的做法 – gbdavid 2015-10-23 07:59:18

0

我看到兩個問題:主要的是你有<key>OnDemand</key><false/>,它告訴launchd代理需要我保持活着(這似乎是重寫<key>KeepAlive</key><false/>,這意味着完全相反)。第二個問題是您在<key> LaunchOnlyOnce</key><true/>的密鑰名稱前有一個空格。簡單的解決方案:刪除OnDemand和LaunchOnlyOnce鍵,它應該工作正常。

+0

感謝戈登和布萊恩, – David 2010-09-20 14:58:52

+0

LSSharedFileListRef也許是更好的controled但它在10.4不支持,我的應用程序必須在10.4上運行。我根據Gordon的程序修復了plist,並且它可以工作,但是對於同一臺機器上的所有用戶,不會啓動應用程序。如果我快速用戶切換新會話不啓動我的應用程序.... – David 2010-09-20 15:01:00

+0

是否有任何解決方法?謝謝大衛 – David 2010-09-20 15:01:18

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> 

希望這有助於