Register as Login Item with Cocoa?

后端 未结 7 975
花落未央
花落未央 2020-11-27 03:13

Google gave me: http://developer.apple.com/samplecode/LoginItemsAE/index.html

And I figured there must be a better way than using AppleScript Events.

So I do

相关标签:
7条回答
  • 2020-11-27 04:03

    This works on xcode 5.

    - (BOOL)isLaunchAtStartup {
        // See if the app is currently in LoginItems.
        LSSharedFileListItemRef itemRef = [self itemRefInLoginItems];
        // Store away that boolean.
        BOOL isInList = itemRef != nil;
        // Release the reference if it exists.
        if (itemRef != nil) CFRelease(itemRef);
    
        return isInList;
    }
    
    - (void)toggleLaunchAtStartup {
        // Toggle the state.
        BOOL shouldBeToggled = ![self isLaunchAtStartup];
        // Get the LoginItems list.
        LSSharedFileListRef loginItemsRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
        if (loginItemsRef == nil) return;
        if (shouldBeToggled) {
            // Add the app to the LoginItems list.
            CFURLRef appUrl = (__bridge CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
            LSSharedFileListItemRef itemRef = LSSharedFileListInsertItemURL(loginItemsRef, kLSSharedFileListItemLast, NULL, NULL, appUrl, NULL, NULL);
            if (itemRef) CFRelease(itemRef);
        }
        else {
            // Remove the app from the LoginItems list.
            LSSharedFileListItemRef itemRef = [self itemRefInLoginItems];
            LSSharedFileListItemRemove(loginItemsRef,itemRef);
            if (itemRef != nil) CFRelease(itemRef);
        }
        CFRelease(loginItemsRef);
    }
    
    - (LSSharedFileListItemRef)itemRefInLoginItems {
        LSSharedFileListItemRef res = nil;
    
        // Get the app's URL.
        NSURL *bundleURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
        // Get the LoginItems list.
        LSSharedFileListRef loginItemsRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
        if (loginItemsRef == nil) return nil;
        // Iterate over the LoginItems.
        NSArray *loginItems = (__bridge NSArray *)LSSharedFileListCopySnapshot(loginItemsRef, nil);
        for (id item in loginItems) {
            LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)(item);
            CFURLRef itemURLRef;
            if (LSSharedFileListItemResolve(itemRef, 0, &itemURLRef, NULL) == noErr) {
                // Again, use toll-free bridging.
                NSURL *itemURL = (__bridge NSURL *)itemURLRef;
                if ([itemURL isEqual:bundleURL]) {
                    res = itemRef;
                    break;
                }
            }
        }
        // Retain the LoginItem reference.
        if (res != nil) CFRetain(res);
        CFRelease(loginItemsRef);
        CFRelease((__bridge CFTypeRef)(loginItems));
    
        return res;
    }
    
    0 讨论(0)
提交回复
热议问题