macOS - Swift 和终端中的 UserDefaults 不同

macOS - UserDefaults is different in Swift and Terminal

我正在尝试使用 UserDefaults 从我的 Swift 应用程序访问系统首选项(特别是 com.apple.menuextra.clock DateFormat)。使用终端,defaults read com.apple.menuextra.clock returns

{
    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,但这也不起作用。

提前致谢。

您搜索的域不正确。当您调用 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)
}

对于以后有此问题的任何其他人:我通过关闭 App Sandbox 解决了这个问题。