macOS - UserDefaults отличается в Swift и Terminal - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь получить доступ к системным настройкам (особенно com.apple.menuextra.clock DateFormat) из моего приложения Swift, используя UserDefaults. Используя терминал, 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, но это тоже не сработает.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Для всех, у кого есть этот вопрос в будущем: я исправил его, отключив App Sandbox.

0 голосов
/ 19 ноября 2018

Вы не искали в нужном домене. Когда вы звоните dictionary(forKey:), bool(forKey:), integer(forKey:) и т. Д., Вы просматриваете иерархию доменов :

  • NSArgumentDomain: аргументы, которые передаются вашему приложению при его запуске.
  • Домен приложения: ключи, которые вы определили в своем приложении.
  • NSGlobalDomain: настройки системного уровня.
  • Языки: системные настройки, которые определяются выбором языка пользователем.
  • NSRegistrationDomain: временные ключи, которые определяет ваше приложение. Должен быть перерегистрирован каждый раз, когда ваше приложение запускается. Если вы хотите, чтобы он прикрепился, используйте домен приложения.

com.apple.menuextra.clock не является ключом в иерархии выше. Это домен сам по себе (его можно рассматривать как отдельное приложение со своими предпочтениями). Используйте это вместо:

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