登录项目 - 可可

时间:2016-04-02 17:44:32

标签: swift cocoa

有没有办法检查登录项是否已经存在(使用应用程序的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")
    }
}

就我而言,这是您实现复选框以启用/禁用登录项的方式。

它在我的应用程序中的作用是每次我选中它启动帮助应用程序的框(它再次启动我的应用程序)。

1 个答案:

答案 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%安全的。