Created
September 21, 2020 00:06
-
-
Save matthewtonkin/17acc8910257c7694471a09096c54820 to your computer and use it in GitHub Desktop.
NSApplication Open at Login extension
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@implementation NSApplication (OpenAtLogin) | |
#pragma clang diagnostic push | |
#pragma clang diagnostic ignored "-Wdeprecated-declarations" | |
- (BOOL)openAtLogin | |
{ | |
LSSharedFileListItemRef loginItem = [self loginItem]; | |
BOOL result = loginItem ? YES : NO; | |
if (loginItem) { | |
CFRelease(loginItem); | |
} | |
return result; | |
} | |
- (void)setOpenAtLogin:(BOOL)openAtLogin | |
{ | |
if (openAtLogin == self.openAtLogin) { | |
return; | |
} | |
LSSharedFileListRef loginItemsRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); | |
if (openAtLogin) { | |
CFURLRef appUrl = (__bridge CFURLRef)[[NSBundle mainBundle] bundleURL]; | |
LSSharedFileListItemRef itemRef = LSSharedFileListInsertItemURL(loginItemsRef, kLSSharedFileListItemLast, NULL, NULL, appUrl, NULL, NULL); | |
if (itemRef) { | |
CFRelease(itemRef); | |
} | |
} else { | |
LSSharedFileListItemRef loginItem = [self loginItem]; | |
LSSharedFileListItemRemove(loginItemsRef, loginItem); | |
if (loginItem) { | |
CFRelease(loginItem); | |
} | |
} | |
if (loginItemsRef) { | |
CFRelease(loginItemsRef); | |
} | |
} | |
- (LSSharedFileListItemRef)loginItem | |
{ | |
LSSharedFileListRef loginItemsRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); | |
if (!loginItemsRef) { | |
return NULL; | |
} | |
NSArray *loginItems = CFBridgingRelease(LSSharedFileListCopySnapshot(loginItemsRef, nil)); | |
LSSharedFileListItemRef result = NULL; | |
for (id item in loginItems) { | |
LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)item; | |
CFURLRef itemURLRef; | |
if (LSSharedFileListItemResolve(itemRef, 0, &itemURLRef, NULL) == noErr) { | |
NSURL *itemURL = (__bridge NSURL *)itemURLRef; | |
if ([itemURL isEqual:NSBundle.mainBundle.bundleURL]) { | |
result = itemRef; | |
break; | |
} | |
} | |
} | |
if (result) { | |
CFRetain(result); | |
} | |
CFRelease(loginItemsRef); | |
return result; | |
} | |
#pragma clang diagnostic pop | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment