Пакет настроек iOS пуст при первом посещении

У меня есть приложение, написанное на Swift (iOS 8), которое при первом открытии предлагает перейти к настройкам на главной панели настроек iOS. Он использует этот код:

UIApplication.sharedApplication().openURL(NSURL(string:UIApplicationOpenSettingsURLString)!)

Это работает нормально, за исключением того, что панель настроек пуста, когда вы прибываете. Если вы нажмете кнопку «Назад в настройках», а затем вернетесь в настройки приложения, отобразятся все параметры.

Я предполагаю, что это связано с той же проблемой, когда nsuserdefaults не существует до тех пор, пока пользователь не зайдет на панель настроек.

В любом случае, кто-нибудь знает, как обойти это?

Примечания:

1) Это происходит только при первом запуске приложения ПОСЛЕ его первоначальной установки. После того, как панель настроек была посещена хотя бы один раз, она работает нормально.

2) Мое приложение уже проверяет наличие начального значения по умолчанию; если отсутствует, он инициализирует ВСЕ настройки, как для текущего сеанса, И записывает их в пакет настроек — я проверил, что эта часть работает, перевернув одно из значений по умолчанию с истинного на ложное и заметив, что оно ложно при первом просмотре настройки.


person Bill Read    schedule 18.11.2014    source источник


Ответы (3)


После дальнейших исследований и пары часов возни у меня больше нет проблемы. Я думаю, что это одна из двух вещей, причем № 2 является наиболее вероятным ИМО:

  1. Инициализация перенесена из моего класса модели в мой AppDelegate. (Несмотря на проверку того, что настройки были успешно инициализированы моим классом модели, мне все равно нравится делать это из AppDelegate.)

  2. Убедитесь, что я принудительно закрыл приложение НАСТРОЙКИ перед установкой нового приложения (используя жест смахивания вверх).

Даже после выполнения # 1 я видел поведение случайным образом, и я думаю, что это связано с самим приложением «Настройки». Еще одно поведение, которое я видел, заключалось в том, что список установленных приложений в разделе «НАСТРОЙКИ» фактически повторялся — это исчезло бы, если бы я принудительно закрыл его. Так что я предполагаю, что я должен был принудительно отключать настройки между установками.

person Bill Read    schedule 19.11.2014
comment
2) это ответ для меня (с той же проблемой). Итак, есть ли более элегантный (удобный для пользователя) способ добиться этого. У меня возникает эта проблема при развертывании/тестировании на физическом устройстве; с симулятором проблем нет. - person Steffo; 09.04.2015
comment
Стеффо, наконец-то я настроил приложение так, чтобы все настройки инициализировались при первом запуске. Мне нужно было добавить заставку при первом запуске, поэтому пришлось инициализировать настройку для этого — было просто просто пойти дальше и сделать все настройки таким же образом. - person Bill Read; 11.04.2015

Не уверен, как вы устанавливаете значения по умолчанию на основе вашего описания. Вы можете попробовать установить их таким образом.

var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
let setValue = "yoururl"    
defaults.setObject(setValue, forKey: "url")
defaults.synchronize()

Чтобы просмотреть, что находится в значении перед установкой, просто добавьте эту строку после строки var. Затем добавьте его после defaults.synchronize(), чтобы увидеть, что было установлено.

println(defaults.objectForKey:@"url")

Также вы можете попробовать установить их в процессе сборки с помощью скрипта.

person MwcsMac    schedule 18.11.2014
comment
Спасибо, я уже делаю это. См. мою заметку № 2 в исходном вопросе. - person Bill Read; 19.11.2014

Вы должны зарегистрировать свои пользовательские значения по умолчанию со значениями по умолчанию при запуске приложения, чтобы значения создавались, если они не существуют. Пример:

var itemDefaults = Dictionary<String,NSNumber>()
itemDefaults["myKey"] = NSNumber(int: 1)

let userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.registerDefaults(itemDefaults)
person zisoft    schedule 18.11.2014
comment
Спасибо, я уже делаю это. См. мою заметку № 2 в исходном вопросе. - person Bill Read; 19.11.2014
comment
Я беру свои слова назад — я не использую метод registerDefaults. Однако я устанавливаю значения по умолчанию при запуске: var prefs = NSUserDefaults.standardUserDefaults() prefs.setInteger(30, forKey: "duration") prefs.synchronize() Насколько я понимаю, это пишет в пакет настроек — по крайней мере, это можно проверить, зайдя в настройки. - person Bill Read; 19.11.2014