diff --git a/HeliPort/Info.plist b/HeliPort/Info.plist index 085d43c..23e043f 100644 --- a/HeliPort/Info.plist +++ b/HeliPort/Info.plist @@ -44,6 +44,18 @@ + SMAppService + + LoginItems + + + Identifier + $(PRODUCT_BUNDLE_IDENTIFIER)-Launcher + Enabled + + + + NSSupportsAutomaticTermination NSSupportsSuddenTermination diff --git a/HeliPort/LoginItemManager.swift b/HeliPort/LoginItemManager.swift index 7d5e0ed..31d938a 100644 --- a/HeliPort/LoginItemManager.swift +++ b/HeliPort/LoginItemManager.swift @@ -21,20 +21,38 @@ class LoginItemManager { private static let launcherId = Bundle.main.bundleIdentifier! + "-Launcher" public class func isEnabled() -> Bool { + if #available(macOS 13.0, *) { + return SMAppService.mainApp.status == .enabled + } else { + guard let jobs = + (LoginItemManager.self as DeprecationWarningWorkaround.Type).jobsDict + else { + return false + } - guard let jobs = - (LoginItemManager.self as DeprecationWarningWorkaround.Type).jobsDict - else { - return false - } - - let job = jobs.first { $0["Label"] as? String? == launcherId } + let job = jobs.first { $0["Label"] as? String? == launcherId } - return job?["OnDemand"] as? Bool ?? false + return job?["OnDemand"] as? Bool ?? false + } } public class func setStatus(enabled: Bool) { - SMLoginItemSetEnabled(launcherId as CFString, enabled) + if #available(macOS 13.0, *) { + do { + if enabled { + if SMAppService.mainApp.status == .enabled { + try? SMAppService.mainApp.unregister() + } + try SMAppService.mainApp.register() + } else { + try SMAppService.mainApp.unregister() + } + } catch { + Log.error("Failed to \(enabled ? "enable" : "disable") login item: \(error.localizedDescription)") + } + } else { + SMLoginItemSetEnabled(launcherId as CFString, enabled) + } } } @@ -48,4 +66,4 @@ extension LoginItemManager: DeprecationWarningWorkaround { static var jobsDict: [[String: AnyObject]]? { SMCopyAllJobDictionaries(kSMDomainUserLaunchd)?.takeRetainedValue() as? [[String: AnyObject]] } -} +} \ No newline at end of file