Ouverture d'une application au démarrage de OS X

iShadowiShadow Membre
20:33 modifié dans API AppKit #1
Salut !

Je voudrais vous demander comment faire pour ajouter une application au démarrage de Mac OS X (enfin de la session) si l'utilisateur coche cette fonction dans les prefs de mon app. Je ne sais vraiment pas comment faire ::)

Merci de m'aider :)

@+ !

P.S. : je suis débutant, cela serai sympa d'utiliser un langage simple pour que je comprenne :D

Réponses

  • ObiObi Membre
    20:33 modifié #2
    Je cherche à  faire la même chose et j'ai trouvé des liens qui expliquent comment faire. J'ai pas encore tout testé mais ca marche sans trop de souci pour le peu que j'ai déjà  fait.

    http://www.cocoadev.com/index.pl?AddingYourAppToLoginWindow
    http://www.cocoadev.com/index.pl?KnowingIfAppWasLaunchedFromLoginItems
    http://cocoa.mamasam.com/COCOADEV/2003/02/2/57560.php
  • iShadowiShadow Membre
    20:33 modifié #3
    Merci beaucoup !

    Malheuresement je n'arrive pas du tout à  mettre cela en place. Je voudrais juste faire en sorte que quand on clique sur un bouton, cela ajoute l'appli dans le démarrage.

    Merci ! :)
  • 20:33 modifié #4
    c'est assez simple
    Utilise NSFileManager !
    ainsi, tu dupliques ton app grâce à  la fonction
    movePath:(NSString *)aPath toPath:(NSString *)anotherPath handler:(id)handler
    


    Pour obtenir la localisation de ton programme actuel, utilise :
    - (NSString *)currentDirectoryPath
    


    Sachant que une app qui s'ouvre au démarrage d'une session est forcément placée dans : Library/StartupItems/

    En exemple, ça donne :
    NSFileManager *fileManage = [NSFileManager defaultManager];<br />NSString *currentDirectory = [fileManage currentDirectoryPath];<br />NSString *applicationPath = [currentDirectory stringByAppendingPathComponent:@&quot;MonApp.app&quot;];<br />[fileManage moveFileAtPath:applicationPath toPath:@&quot;Library/StartupItems&quot;];<br />
    


    Normalement ça marche :fouf):
  • ChachaChacha Membre
    20:33 modifié #5
    dans 1116758885:

    Sachant que une app qui s'ouvre au démarrage d'une session est forcément placée dans : Library/StartupItems/


    Ce ne sont pas des applis qu'on met dans StartupItems, mais des scripts de démarrage pour des daemons, accompagnés d'un fichier plist descriptif, très utile pour ce qui est des dépendances entre services. Je ne peux que conseiller de lire la doc des StartupItems
    http://developer.apple.com/documentation/MacOSX/Conceptual/BPSystemStartup/Articles/StartupItems.html
    Au pire, il suffit de regarder un StartupItem existant pour voir que ça n'a rien de sorcier.

    Mais pour faire en sorte de lancer une appli au démarrage, il vaut mieux rajouter une entrée au dico AutoLaunchedApplicationDictionary de ~/Library/Preferences/loginwindow.plist

    +
    Chacha
  • 20:33 modifié #6
    C'est clair que la solution du ~/Library/Preferences/loginWindow.plist c'est assez malin
  • ChachaChacha Membre
    20:33 modifié #7
    dans 1116769446:

    C'est clair que la solution du ~/Library/Preferences/loginWindow.plist c'est assez malin

    Ce qui est marrant, c'est que je n'en savais rien avant de répondre à  ce post ! Je me suis dit : "tiens, c'est vrai, où est-ce que c'est stocké, le fait que mon iCal démarre à  chaque login ?" Du coup, j'ai fait une recherche de tous les fichiers contenant le mot "iCal" dans ~/Library/Preferences/
    <br />grep -r &quot;iCal&quot; ~/Library/Preferences/*.plist<br />
    

    Et ça m'a donné la réponse à  une question que je ne m'étais jamais posée.
    Comme quoi, c'est toujours intéressant ce genre de post !

    +
    Chacha
  • 20:33 modifié #8
    Voici le code que j'utilise dans mon application :

    <br />- (BOOL)isInAutoLaunchDictionary<br />{<br />	NSString *loginwindowPlist=[@&quot;~/Library/Preferences/loginwindow.plist&quot; stringByExpandingTildeInPath];<br />	NSDictionary *autoLaunchedApps=[NSDictionary dictionaryWithContentsOfFile:loginwindowPlist];<br />	NSArray *appsArray=[autoLaunchedApps objectForKey:@&quot;AutoLaunchedApplicationDictionary&quot;];<br />	NSEnumerator *anEnum=[appsArray objectEnumerator];<br />	id anObject;<br />	<br />	while ((anObject=[anEnum nextObject])) {<br />		if ([[[NSBundle mainBundle]bundlePath] isEqualToString:[anObject objectForKey:@&quot;Path&quot;]]) {<br />			return YES;<br />		}<br />	}<br />	<br />	return NO;<br />}<br />- (void) setIsInAutoLaunchDictionary:(BOOL)value<br />{<br />	int i;<br />	<br />	NSMutableDictionary * loginDict;<br />	NSString *itemPfad = [[NSBundle mainBundle]bundlePath]; <br />		<br />&nbsp; &nbsp; NSMutableArray *loginItems = (NSMutableArray*) <br />		CFPreferencesCopyValue((CFStringRef)@&quot;AutoLaunchedApplicationDictionary&quot; <br />							&nbsp;  , (CFStringRef) @&quot;loginwindow&quot;, kCFPreferencesCurrentUser, <br />							&nbsp;  kCFPreferencesAnyHost); <br />	<br />&nbsp; &nbsp; loginItems = [[loginItems autorelease] mutableCopy]; <br />	<br />&nbsp; &nbsp; if(value==YES)<br />	{<br />		loginDict = [[NSMutableDictionary alloc] init]; <br />	&nbsp; &nbsp; [loginDict setObject: itemPfad forKey: @&quot;Path&quot;]; <br />	&nbsp; &nbsp; [loginDict setObject: [NSNumber numberWithBool:FALSE] forKey: @&quot;Hide&quot;];<br />		[loginItems addObject: loginDict]; <br />		[loginDict release]; <br />	}<br />	else<br />	{<br />		for(i = 0; i &lt; [loginItems count]; i++) <br />		{ <br />			loginDict = [loginItems objectAtIndex: i]; <br />			if (NSOrderedSame == [(NSString *)[loginDict objectForKey:@&quot;Path&quot;] compare: itemPfad]) <br />			{ <br />				[loginItems removeObjectAtIndex:i];<br />				break;<br />			} <br />		} <br />	}<br />	<br />	<br />	CFPreferencesSetValue((CFStringRef)@&quot;AutoLaunchedApplicationDictionary&quot;, <br />						&nbsp; loginItems, (CFStringRef)@&quot;loginwindow&quot;, kCFPreferencesCurrentUser, <br />						&nbsp; kCFPreferencesAnyHost); <br />&nbsp; &nbsp; CFPreferencesSynchronize((CFStringRef) @&quot;loginwindow&quot;, <br />							 kCFPreferencesCurrentUser, kCFPreferencesAnyHost); <br />}<br /><br />
    


    Ca, plus un coup de bindings, et le tour est joué!
Connectez-vous ou Inscrivez-vous pour répondre.