有没有办法检查登录项是否已经存在(使用应用程序的bundleIdentifier?)我希望能够查看是否有登录项以及是否启用。 当我使用以下命令启用登录项时,我试图在applicationDidFinishLuanching中检查我的复选框:
if (SMLoginItemSetEnabled(("bundleIDOfMyApp" as CFStringRef), true)) {
self.startAtLoginButton.state = 1
} else {
self.startAtLoginButton.state = 0
}
它做了它的事情,但它也启动了我的帮助应用程序。
另一件事是:
@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")
}
}
就我而言,这是您实现复选框以启用/禁用登录项的方式。
它在我的应用程序中的作用是每次我选中它启动帮助应用程序的框(它再次启动我的应用程序)。
答案 0 :(得分:5)
虽然方法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
需要双重投射才能将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.")
}
}
}
斯威夫特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.")
}
}
}
附注:启动作业需要键Label
,因此在filter
函数中展开可选项是100%安全的。