2016-04-02 23 views
2

Giriş öğesinin var olup olmadığını kontrol etmenin bir yolu var mı (uygulamanın bundleIdentifier ile?) Bir giriş maddesi olup olmadığını görmek ve etkinleştirmek istiyorsanız görmek istiyorum. giriş öğesi bu için seçilmiştir zaman applicationDidFinishLuanching benim onay kutusunu çalışıyordu:Giriş Öğe - kakao

if (SMLoginItemSetEnabled(("bundleIDOfMyApp" as CFStringRef), true)) { 
     self.startAtLoginButton.state = 1 
    } else { 
     self.startAtLoginButton.state = 0 
    } 

Onun şeyi yapar, ama aynı zamanda benim yardımcı uygulamayı başlatır.

başka şey

şudur:

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

Bildiğim kadarıyla bu endişeliyim gibi/devre dışı giriş öğesini etkinleştirmek için onay kutusunu uygulamak yoludur.

Uygulamamda, kutuyu işaretlediğimde her zaman yardımcı uygulama uygulamasını başlattığım (bu, uygulamanızı yeniden başlatıyor).

cevap

4

yöntem SMCopyAllJobDictionaries() bu işi etkin olup olmadığını kontrol etmek için olağan bir yoldur kaldırılmış olmasına rağmen, SMLoginItemSetEnabled sadece çift döküm NSArray için CFArray döküm için gerekli olan değeri

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 

ayarlamak için kullanılabilir ve Daha sonra Array<String,AnyObject>


için de genellikle kutusunun KVC üzeri özelliğine bağlıdır. Yukarıdaki satırlar alıcı ve SMLoginItemSetEnabled örneğin ayarlayıcı

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

Swift 3'tür:

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

Yan not: Bir Launchd iş anahtarı Label gerektirir, bundan dolayı unwrap% 100 güvenli filter işlevinde isteğe bağlı.

+0

Uoou! Bu oldukça gelişmiş. Umarım birçok insana yardım eder. Bunun için çok teşekkürler! – Ancinek

+1

Kodunuzu projemde uyguladım, ancak hala bir sorunum var. Onay kutumu kullanarak startAtLogin'i ayarladığımda, ana uygulamamı başlatan yardımcım uygulamasını başlattı. – Ancinek

+0

Bu kod basittir, aynı davranışta olan yardımcı uygulaması – vadian