Comment rendez-vous votre application ouverte lors de la connexion? [dupliquer]

StackOverflow https://stackoverflow.com/questions/815063

  •  03-07-2019
  •  | 
  •  

Question

    

Cette question a déjà une réponse ici:

         

Je me demandais simplement comment rendre mon application ouverte automatiquement lors de la connexion, mais que cette option puisse être activée et désactivée à l'aide d'une case à cocher située dans la fenêtre des préférences.

Était-ce utile?

La solution

Il existe une description décente de la marche à suivre à l'adresse CocoaDev .

En gros, vous voudrez utiliser l'API dans LaunchServices / LSSharedFileList.h si vous pouvez cibler Mac OS X 10.5 ou une version ultérieure. Avant 10.5, il n'y avait pas d'API propre, vous devez donc manipuler manuellement les éléments de connexion ( Exemple de code sur la connexion de développeur ).

Voici le exemple de code . (mort) pour Leopard que j'ai mentionné dans les commentaires. Trouvé via cet article de blog . Le code dont vous avez besoin pour activer ou désactiver le démarrage à la connexion est dans Controller.m.

Autres conseils

Voici un code que j'utilise, basé sur la source de Growl.

+ (BOOL) willStartAtLogin:(NSURL *)itemURL
{
    Boolean foundIt=false;
    LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
    if (loginItems) {
        UInt32 seed = 0U;
        NSArray *currentLoginItems = [NSMakeCollectable(LSSharedFileListCopySnapshot(loginItems, &seed)) autorelease];
        for (id itemObject in currentLoginItems) {
            LSSharedFileListItemRef item = (LSSharedFileListItemRef)itemObject;

            UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
            CFURLRef URL = NULL;
            OSStatus err = LSSharedFileListItemResolve(item, resolutionFlags, &URL, /*outRef*/ NULL);
            if (err == noErr) {
                foundIt = CFEqual(URL, itemURL);
                CFRelease(URL);

                if (foundIt)
                    break;
            }
        }
        CFRelease(loginItems);
    }
    return (BOOL)foundIt;
}

+ (void) setStartAtLogin:(NSURL *)itemURL enabled:(BOOL)enabled
{
    OSStatus status;
    LSSharedFileListItemRef existingItem = NULL;

    LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
    if (loginItems) {
        UInt32 seed = 0U;
        NSArray *currentLoginItems = [NSMakeCollectable(LSSharedFileListCopySnapshot(loginItems, &seed)) autorelease];
        for (id itemObject in currentLoginItems) {
            LSSharedFileListItemRef item = (LSSharedFileListItemRef)itemObject;

            UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
            CFURLRef URL = NULL;
            OSStatus err = LSSharedFileListItemResolve(item, resolutionFlags, &URL, /*outRef*/ NULL);
            if (err == noErr) {
                Boolean foundIt = CFEqual(URL, itemURL);
                CFRelease(URL);

                if (foundIt) {
                    existingItem = item;
                    break;
                }
            }
        }

        if (enabled && (existingItem == NULL)) {
            LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemBeforeFirst,
                                          NULL, NULL, (CFURLRef)itemURL, NULL, NULL);

        } else if (!enabled && (existingItem != NULL))
            LSSharedFileListItemRemove(loginItems, existingItem);

        CFRelease(loginItems);
    }       
}

Si vous voulez une case à cocher facile à implémenter, créez un @property BOOL startAtLogin; dans l'une de vos classes et implémentez-le comme suit. Liez simplement la valeur de la case à cocher à la propriété et tout devrait fonctionner de manière transparente.

- (NSURL *)appURL
{
    return [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
}

- (BOOL)startAtLogin
{
    return [LoginItem willStartAtLogin:[self appURL]];
}

- (void)setStartAtLogin:(BOOL)enabled
{
    [self willChangeValueForKey:@"startAtLogin"];
    [LoginItem setStartAtLogin:[self appURL] enabled:enabled];
    [self didChangeValueForKey:@"startAtLogin"];
}

Appelez la méthode collée ci-dessous avec une URL de fichier pointant sur votre application pour l'ajouter aux éléments de connexion de l'utilisateur actuel.

Pour désactiver à nouveau, vous devez obtenir le même loginListRef, le convertir en tableau et le parcourir jusqu'à ce que vous trouviez l'élément avec l'URL que vous souhaitez désactiver. Enfin, appelez LSSharedFileListItemRemove avec les arguments appropriés.

Bonne chance:)

- (void)enableLoginItemWithURL:(NSURL *)itemURL
{
    LSSharedFileListRef loginListRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);

    if (loginListRef) {
        // Insert the item at the bottom of Login Items list.
        LSSharedFileListItemRef loginItemRef = LSSharedFileListInsertItemURL(loginListRef, 
                                             kLSSharedFileListItemLast, 
                                             NULL, 
                                             NULL,
                                             (CFURLRef)itemURL, 
                                             NULL, 
                                             NULL);     
        if (loginItemRef) {
            CFRelease(loginItemRef);
        }
        CFRelease(loginListRef);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top