2016-04-02 19 views
2

ログイン項目がすでに存在するかどうかを確認する方法はありますか(アプリケーションの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") 
    } 
} 

私の知る限り、これはあなたが/無効にログイン項目を有効にする]チェックボックスを実装する方法です心配として。

私のアプリでは、ヘルパーアプリを起動する(私のアプリをもう一度起動する)チェックボックスをチェックするたびに何が行われますか?

答えて

4

方法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 

ダブルキャストはNSArrayCFArrayをキャストするために必要とされると、 to Array<String,AnyObject>


通常、チェックボックスはKVC経由のプロパティにバインドされています。上記の行はゲッターであり、SMLoginItemSetEnabledは、例えばセッター

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.") 
    } 
    } 
} 

サイドノート:launchdのジョブはキーLabelが必要ですので、それはアンラップし、100%安全ですfilter機能ではオプションです。

+0

Uoou!それはかなり高度です。それが多くの人々を助けることを願っています。それはありがとう! – Ancinek

+1

私のプロジェクトにあなたのコードを実装しましたが、まだ問題は1つあります。自分のチェックボックスを使ってstartAtLoginを設定すると、メインアプリケーションを起動するヘルパーアプリが起動します。 – Ancinek

+0

コードは簡単ですが、ヘルパーアプリケーションを統合する際にデザイン上の問題が発生する可能性があります。 – vadian