有没有一种方法可以检查登录项是否已经存在(使用应用程序的bundleIdentifier?),我希望能够查看是否有登录项以及是否启用了该登录项。使用以下启用登录项时,我试图在applicationDidFinishLuanching中选中我的复选框:
if (SMLoginItemSetEnabled(("bundleIDOfMyApp" as CFStringRef), true)) {
self.startAtLoginButton.state = 1
} else {
self.startAtLoginButton.state = 0
}
Run Code Online (Sandbox Code Playgroud)
它完成了它的任务,但同时也启动了我的助手应用程序。
另一件事是这样的:
@IBAction func startAtLoginButtonChecked(sender: NSButton) {
var enabled = false
if sender.state == 0 { enabled = false }
if sender.state == 1 { enabled = true }
if !SMLoginItemSetEnabled(("bundleIDOfMyApp" as CFStringRef), enabled) {
print("Login was not successful")
}
}
Run Code Online (Sandbox Code Playgroud)
就我而言,这是您实现复选框以启用/禁用登录项目的方式。
它在我的应用程序中的作用是,每当我选中该复选框时,它将启动帮助程序应用程序(再次启动我的应用程序)。
尽管SMCopyAllJobDictionaries()不赞成使用该方法,但是这是检查作业是否启用的常用方法,SMLoginItemSetEnabled仅用于设置值
import ServiceManagement
let jobDicts = SMCopyAllJobDictionaries( kSMDomainUserLaunchd ).takeRetainedValue() as NSArray as! [[String:AnyObject]]
let label = "bundleIDOfMyApp"
let jobEnabled = jobDicts.filter { $0["Label"] as! String == label }.isEmpty == false
Run Code Online (Sandbox Code Playgroud)
双铸件需要投CFArray给NSArray再到 Array<String,AnyObject>
通常,复选框也通过KVC绑定到属性。上面的行是getter,SMLoginItemSetEnabled例如是setter
let helperBundleIdentifier = "bundleIDOfMyApp"
@available(OSX, deprecated=10.10) // this line suppresses the 'deprecated' warning
dynamic var startAtLogin : Bool {
get {
guard let jobDicts = SMCopyAllJobDictionaries( kSMDomainUserLaunchd ).takeRetainedValue() as NSArray as? [[String:AnyObject]] else { return false }
return jobDicts.filter { $0["Label"] as! String == helperBundleIdentifier }.isEmpty == false
} set {
if !SMLoginItemSetEnabled(helperBundleIdentifier, newValue) {
print("SMLoginItemSetEnabled failed.")
}
}
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特3:
@available(OSX, deprecated: 10.10)
dynamic var startAtLogin : Bool {
get {
guard let jobDicts = SMCopyAllJobDictionaries( kSMDomainUserLaunchd ).takeRetainedValue() as? [[String:Any]] else { return false }
return jobDicts.first(where: { $0["Label"] as! String == helperBundleIdentifier }) != nil
} set {
if !SMLoginItemSetEnabled(helperBundleIdentifier as CFString, newValue) {
print("SMLoginItemSetEnabled failed.")
}
}
}
Run Code Online (Sandbox Code Playgroud)
旁注:启动的作业需要密钥,Label因此解开该filter功能中的可选部件是100%安全的。