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 解决了这个问题。
我正在尝试使用 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 解决了这个问题。