Skip to content

Instantly share code, notes, and snippets.

@tranquan
Created December 20, 2020 15:50
Show Gist options
  • Save tranquan/6f8c9de4becd9601160f39e2917ae836 to your computer and use it in GitHub Desktop.
Save tranquan/6f8c9de4becd9601160f39e2917ae836 to your computer and use it in GitHub Desktop.
Login Service Utils for macOS
// 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