【问题标题】:macOS - UserDefaults is different in Swift and TerminalmacOS - UserDefaults 在 Swift 和终端中是不同的
【发布时间】:2018-11-19 11:29:00
【问题描述】:

我正在尝试使用 UserDefaults 从我的 Swift 应用程序中访问系统偏好设置(特别是 com.apple.menuextra.clock DateFormat)。使用终端,defaults read com.apple.menuextra.clock 返回

{
    DateFormat = "EEE MMM d  h:mm:ss a";
    FlashDateSeparators = 0;
    IsAnalog = 0;
}

但是,如果我在我的 Swift 应用中这样做

print(UserDefaults.standard.dictionary(forKey: "com.apple.menuextra.clock"))

我收到nil

如何在 Swift 中访问它?如果有帮助,我只在寻找DateFormat,所以我知道用户更喜欢 12 小时还是 24 小时。我试过了

DateFormatter.dateFormat(fromTemplate: "j", options: 0, locale: Locale.current)!

然后查找它是否包含a,但这也不起作用。

提前致谢。

【问题讨论】:

    标签: swift macos terminal nsuserdefaults


    【解决方案1】:

    致未来有此问题的其他人:我通过关闭 App Sandbox 解决了这个问题。

    【讨论】:

    • 任何人都在寻找这个问题的答案......您将需要 UserDefaults.standard.persistentDomain 和沙盒关闭
    【解决方案2】:

    您没有在正确的域中进行搜索。当您调用dictionary(forKey:)bool(forKey:)integer(forKey:) 等时,您正在搜索hierarchy of domains

    • NSArgumentDomain:应用启动时传递给应用的参数。
    • 应用程序域:您在应用程序中定义的键。
    • NSGlobalDomain:系统级首选项。
    • 语言:由用户选择的语言决定的系统级首选项。
    • NSRegistrationDomain:您的应用定义的临时密钥。每次您的应用启动时都必须重新注册。如果您希望它坚持下去,请使用应用程序域。

    com.apple.menuextra.clock 不是上述层次结构中的键。它本身就是一个域(将其视为具有自己偏好的单独应用程序)。改用这个:

    if let dict = UserDefaults.standard.persistentDomain(forName: "com.apple.menuextra.clock") {
        print(dict)
    }
    

    【讨论】:

    • UserDefaults.standard.persistentDomain(forName: "com.apple.menuextra.clock") 仍然返回 nil。
    • 任何人都在寻找这个问题的答案......您将需要 UserDefaults.standard.persistentDomain 和沙盒关闭
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 2021-07-15
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多