Created
December 20, 2020 15:50
-
-
Save tranquan/6f8c9de4becd9601160f39e2917ae836 to your computer and use it in GitHub Desktop.
Login Service Utils for macOS
This file contains hidden or 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
// clone from: https://github.com/Clipy/LoginServiceKit/blob/master/Lib/LoginServiceKit/LoginServiceKit.swift | |
public final class LoginServiceKit: NSObject {} | |
public extension LoginServiceKit { | |
static func isExistLoginItems(at path: String = Bundle.main.bundlePath) -> Bool { | |
return (loginItem(at: path) != nil) | |
} | |
@discardableResult | |
static func addLoginItems(at path: String = Bundle.main.bundlePath) -> Bool { | |
guard !isExistLoginItems(at: path) else { return false } | |
guard let sharedFileList = LSSharedFileListCreate(nil, kLSSharedFileListSessionLoginItems.takeRetainedValue(), nil) else { return false } | |
let loginItemList = sharedFileList.takeRetainedValue() | |
let url = URL(fileURLWithPath: path) | |
LSSharedFileListInsertItemURL(loginItemList, kLSSharedFileListItemBeforeFirst.takeRetainedValue(), nil, nil, url as CFURL, nil, nil) | |
return true | |
} | |
@discardableResult | |
static func removeLoginItems(at path: String = Bundle.main.bundlePath) -> Bool { | |
guard isExistLoginItems(at: path) else { return false } | |
guard let sharedFileList = LSSharedFileListCreate(nil, kLSSharedFileListSessionLoginItems.takeRetainedValue(), nil) else { return false } | |
let loginItemList = sharedFileList.takeRetainedValue() | |
let url = URL(fileURLWithPath: path) | |
let loginItemsListSnapshot: NSArray = LSSharedFileListCopySnapshot(loginItemList, nil).takeRetainedValue() | |
guard let loginItems = loginItemsListSnapshot as? [LSSharedFileListItem] else { return false } | |
for loginItem in loginItems { | |
guard let resolvedUrl = LSSharedFileListItemCopyResolvedURL(loginItem, 0, nil) else { continue } | |
let itemUrl = resolvedUrl.takeRetainedValue() as URL | |
guard url.absoluteString == itemUrl.absoluteString else { continue } | |
LSSharedFileListItemRemove(loginItemList, loginItem) | |
} | |
return true | |
} | |
} | |
private extension LoginServiceKit { | |
static func loginItem(at path: String) -> LSSharedFileListItem? { | |
guard !path.isEmpty else { return nil } | |
guard let sharedFileList = LSSharedFileListCreate(nil, kLSSharedFileListSessionLoginItems.takeRetainedValue(), nil) else { return nil } | |
let loginItemList = sharedFileList.takeRetainedValue() | |
let url = URL(fileURLWithPath: path) | |
let loginItemsListSnapshot: NSArray = LSSharedFileListCopySnapshot(loginItemList, nil).takeRetainedValue() | |
guard let loginItems = loginItemsListSnapshot as? [LSSharedFileListItem] else { return nil } | |
for loginItem in loginItems { | |
guard let resolvedUrl = LSSharedFileListItemCopyResolvedURL(loginItem, 0, nil) else { continue } | |
let itemUrl = resolvedUrl.takeRetainedValue() as URL | |
guard url.absoluteString == itemUrl.absoluteString else { continue } | |
return loginItem | |
} | |
return nil | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment