【发布时间】:2015-12-09 09:32:42
【问题描述】:
我使用SMCopyAllJobDictionaries 和SMJobCopyDictionary 来检查应用程序是否是Mac 中的登录项,但在10.10 中,它们已被弃用。那么他们官方推荐的替代品是什么?
【问题讨论】:
标签: macos
我使用SMCopyAllJobDictionaries 和SMJobCopyDictionary 来检查应用程序是否是Mac 中的登录项,但在10.10 中,它们已被弃用。那么他们官方推荐的替代品是什么?
【问题讨论】:
标签: macos
您不需要更换。只需使用SMLoginItemSetEnabled,如果成功,将值存储在NSUserDefaults 中。每次应用程序启动时,使用您的NSUserDefaults 中的存储值调用SMLoginItemSetEnabled 以检查是否有变化。如果它返回false,请相应地设置您的用户默认值,否则状态仍然是您之前在NSUserDefaults 中记住的状态。
示例:
import Foundation
import ServiceManagement
final class LoginItem {
let identifier: String
private let nc = NSUserDefaults.standardUserDefaults()
init(identifier: String) {
self.identifier = identifier
}
var enabled: Bool {
return nc.boolForKey(defaultKey)
}
func setEnabled(enabled: Bool) -> Bool {
if SMLoginItemSetEnabled(identifier, enabled) {
nc.setBool(enabled, forKey: defaultKey)
return true
}
return false
}
func validate() -> Bool {
if setEnabled(enabled) {
return true
}
nc.removeObjectForKey(defaultKey)
return false
}
private var defaultKey: String {
return "SMLoginItem-" + identifier
}
}
只需在启动时调用validate 即可验证开/关状态。
【讨论】:
true 调用SMLoginItemSetEnabled 正是应用程序在其首选项屏幕中重新启用登录项所需要做的事情。为什么第一次调用会失败(因为用户手动删除了登录项)但第二次调用会成功重新安装登录项。我将不得不尝试这个... ;-)
true 调用SMLoginItemSetEnabled,而是使用您上次在自己的用户默认值中记住的布尔值(状态)调用它。
SMLoginItemSetEnabled 的返回值告诉你调用是否成功。如果是这样,请将您刚刚传入的值存储在用户默认值中。这就是您将用户默认值与您无权访问的 ACTUAL 值同步的方式。