Skip to content

Instantly share code, notes, and snippets.

@matthewtonkin
Created September 21, 2020 00:06
Show Gist options
  • Save matthewtonkin/17acc8910257c7694471a09096c54820 to your computer and use it in GitHub Desktop.
Save matthewtonkin/17acc8910257c7694471a09096c54820 to your computer and use it in GitHub Desktop.
NSApplication Open at Login extension
@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