chore: fix LoginServiceKit
This commit is contained in:
parent
93d006473a
commit
41b68d748f
|
@ -48,59 +48,50 @@
|
|||
|
||||
import Cocoa
|
||||
|
||||
public final class LoginServiceKit: NSObject {}
|
||||
public final class LoginServiceKit: NSObject {
|
||||
private static var snapshot: (list: LSSharedFileList, items: [LSSharedFileListItem])? {
|
||||
guard let list = LSSharedFileListCreate(nil, kLSSharedFileListSessionLoginItems.takeRetainedValue(), nil)?.takeRetainedValue() else {
|
||||
return nil
|
||||
}
|
||||
return (list, (LSSharedFileListCopySnapshot(list, nil)?.takeRetainedValue() as? [LSSharedFileListItem]) ?? [])
|
||||
}
|
||||
|
||||
public extension LoginServiceKit {
|
||||
static func isExistLoginItems(at path: String = Bundle.main.bundlePath) -> Bool {
|
||||
return (loginItem(at: path) != nil)
|
||||
public 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 snapshots = loginItemsListSnapshots() else { return false }
|
||||
|
||||
let url = URL(fileURLWithPath: path)
|
||||
LSSharedFileListInsertItemURL(snapshots.fileList, snapshots.items.last, nil, nil, url as CFURL, nil, nil)
|
||||
return true
|
||||
public static func addLoginItems(at path: String = Bundle.main.bundlePath) -> Bool {
|
||||
guard isExistLoginItems(at: path) == false else {
|
||||
return false
|
||||
}
|
||||
guard let (list, items) = snapshot, let item = items.last else {
|
||||
return false
|
||||
}
|
||||
return LSSharedFileListInsertItemURL(list, item, nil, nil, URL(fileURLWithPath: path) as CFURL, nil, nil) != nil
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
static func removeLoginItems(at path: String = Bundle.main.bundlePath) -> Bool {
|
||||
guard isExistLoginItems(at: path) else { return false }
|
||||
guard let snapshots = loginItemsListSnapshots() else { return false }
|
||||
|
||||
let url = URL(fileURLWithPath: path)
|
||||
for loginItem in snapshots.items {
|
||||
guard let resolvedUrl = LSSharedFileListItemCopyResolvedURL(loginItem, 0, nil) else { continue }
|
||||
let itemUrl = resolvedUrl.takeRetainedValue() as URL
|
||||
guard url.absoluteString == itemUrl.absoluteString else { continue }
|
||||
LSSharedFileListItemRemove(snapshots.fileList, loginItem)
|
||||
public static func removeLoginItems(at path: String = Bundle.main.bundlePath) -> Bool {
|
||||
guard isExistLoginItems(at: path) == true else {
|
||||
return false
|
||||
}
|
||||
guard let (list, items) = snapshot else {
|
||||
return false
|
||||
}
|
||||
return items.filter({
|
||||
LSSharedFileListItemCopyResolvedURL($0, 0, nil)?.takeRetainedValue() == (URL(fileURLWithPath: path) as CFURL) }
|
||||
).allSatisfy {
|
||||
LSSharedFileListItemRemove(list, $0) == noErr
|
||||
}
|
||||
}
|
||||
|
||||
private static func loginItem(at path: String) -> LSSharedFileListItem? {
|
||||
return snapshot?.items.first { item in
|
||||
guard let url = LSSharedFileListItemCopyResolvedURL(item, 0, nil)?.takeRetainedValue() else {
|
||||
return false
|
||||
}
|
||||
return URL(fileURLWithPath: path).absoluteString == (url as URL).absoluteString
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
private extension LoginServiceKit {
|
||||
static func loginItem(at path: String) -> LSSharedFileListItem? {
|
||||
guard !path.isEmpty else { return nil }
|
||||
guard let snapshots = loginItemsListSnapshots() else { return nil }
|
||||
|
||||
let url = URL(fileURLWithPath: path)
|
||||
for loginItem in snapshots.items {
|
||||
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
|
||||
}
|
||||
|
||||
static func loginItemsListSnapshots() -> (fileList: LSSharedFileList, items: [LSSharedFileListItem])? {
|
||||
guard let sharedFileList = LSSharedFileListCreate(nil, kLSSharedFileListSessionLoginItems.takeRetainedValue(), nil) else { return nil }
|
||||
let fileList = sharedFileList.takeRetainedValue()
|
||||
let loginItemsListSnapshot: NSArray = LSSharedFileListCopySnapshot(fileList, nil).takeRetainedValue()
|
||||
let loginItems = loginItemsListSnapshot as? [LSSharedFileListItem]
|
||||
return (fileList, loginItems ?? [])
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue