chore: fix LoginServiceKit
This commit is contained in:
parent
93d006473a
commit
41b68d748f
|
@ -48,59 +48,50 @@
|
||||||
|
|
||||||
import Cocoa
|
import Cocoa
|
||||||
|
|
||||||
public final class LoginServiceKit: NSObject {}
|
public final class LoginServiceKit: NSObject {
|
||||||
|
private static var snapshot: (list: LSSharedFileList, items: [LSSharedFileListItem])? {
|
||||||
public extension LoginServiceKit {
|
guard let list = LSSharedFileListCreate(nil, kLSSharedFileListSessionLoginItems.takeRetainedValue(), nil)?.takeRetainedValue() else {
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
@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)
|
|
||||||
}
|
|
||||||
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
|
return nil
|
||||||
}
|
}
|
||||||
|
return (list, (LSSharedFileListCopySnapshot(list, nil)?.takeRetainedValue() as? [LSSharedFileListItem]) ?? [])
|
||||||
|
}
|
||||||
|
|
||||||
static func loginItemsListSnapshots() -> (fileList: LSSharedFileList, items: [LSSharedFileListItem])? {
|
public static func isExistLoginItems(at path: String = Bundle.main.bundlePath) -> Bool {
|
||||||
guard let sharedFileList = LSSharedFileListCreate(nil, kLSSharedFileListSessionLoginItems.takeRetainedValue(), nil) else { return nil }
|
return loginItem(at: path) != nil
|
||||||
let fileList = sharedFileList.takeRetainedValue()
|
}
|
||||||
let loginItemsListSnapshot: NSArray = LSSharedFileListCopySnapshot(fileList, nil).takeRetainedValue()
|
|
||||||
let loginItems = loginItemsListSnapshot as? [LSSharedFileListItem]
|
@discardableResult
|
||||||
return (fileList, loginItems ?? [])
|
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
|
||||||
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue