【问题标题】:SMCopyAllJobDictionaries and SMJobCopyDictionary is deprecated, so what are their substitutions?SMCopyAllJobDictionaries 和 SMJobCopyDictionary 已被弃用,那么它们的替代品是什么?
【发布时间】:2015-12-09 09:32:42
【问题描述】:

我使用SMCopyAllJobDictionariesSMJobCopyDictionary 来检查应用程序是否是Mac 中的登录项,但在10.10 中,它们已被弃用。那么他们官方推荐的替代品是什么?

【问题讨论】:

    标签: macos


    【解决方案1】:

    您不需要更换。只需使用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 值同步的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多