2010-09-19 18 views
0

Je souhaite lancer mon application chaque fois que l'utilisateur se connecte.Application LaunchAgents pour GUI

I ajouté fichier plist à/dossier/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> 

Tout semble OK, l'application est en cours de chargement, mais quand je quitte mon application son lancement en arrière par le service launchd.

Quelle clé dois-je ajouter/modifier dans mon fichier plist pour empêcher le redémarrage constant de mon application.

Répondre

2

Si vous souhaitez lancer une application standard lors de la connexion, je recommande d'utiliser l'API de liste de fichiers partagés LaunchServices plutôt que launchd. Plutôt que d'avoir à installer une plist de launchd, vous pouvez simplement utiliser cette API pour ajouter votre application aux éléments de connexion de l'utilisateur (ceux que vous voyez dans le panneau Pref de Comptes dans les Préférences Système). Les avantages à ceci sont a) il est plus évident pour l'utilisateur pourquoi l'application se lance à la connexion, b) il est plus facile pour l'utilisateur de l'enlever, et c) si l'utilisateur supprime votre application, launchd se plaindra des erreurs à la console quand il ne parvient pas à lancer l'application (maintenant manquant).

Il ne semble pas y avoir de la documentation de référence pour l'API, mais les fonctions correspondantes se trouvent dans LSSharedFileList.h Le code pour cela ressemble à quelque chose comme:

#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); 
} 

Si vous voulez avoir cette lancement de l'élément pour tous les utilisateurs plutôt que seulement l'utilisateur actuellement connecté, vous pouvez utiliser kLSSharedFileListGlobalLoginItems au lieu de kLSSharedFileListSessionLoginItems.

+0

Apparemment kLSSharedFileListSessionLoginItems a été dépréciée (OS X 10.11) déjà, et Apple suggère que l'utilisation d'agents de lancement est une meilleure pratique – gbdavid

0

Je vois deux problèmes: le premier est que vous avez <key>OnDemand</key><false/>, qui indique launchd que l'agent a besoin de moi maintenu en vie (et cela semble être en train de surcharger <key>KeepAlive</key><false/>, ce qui signifie exactement le contraire). Le problème secondaire est que vous avez un espace avant le nom de clé dans <key> LaunchOnlyOnce</key><true/>. Solution simple: supprimez les clés OnDemand et LaunchOnlyOnce, et cela devrait fonctionner correctement.

+0

Merci à Gordon et Brian, – David

+0

LSSharedFileListRef est peut-être mieux controlée mais il n'est pas pris en charge sur 10.4 et mon application doit fonctionner sur 10.4. J'ai réparé plist selon la procédure de Gordon et cela fonctionne, cependant l'application n'est pas lancée pour tous les utilisateurs sur la même machine. Si la fonction I Fast User Switch ne lance pas mon application .... – David

+0

Y a-t-il une solution de contournement? Merci David – David

0

supprimez la clé Keep Alive ET ne lancez qu'une seule fois ... puisque vous n'avez besoin de lancer l'application qu'une seule fois. Voici un exemple de code pour lancer une application nommée en tant qu'application de connexion.

<?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> 

Hope this helps