登录项目-可可

Anc*_*nek 3 cocoa swift

有没有一种方法可以检查登录项是否已经存在(使用应用程序的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)

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

它在我的应用程序中的作用是,每当我选中该复选框时,它将启动帮助程序应用程序(再次启动我的应用程序)。

vad*_*ian 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
Run Code Online (Sandbox Code Playgroud)

双铸件需要投CFArrayNSArray再到 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%安全的。