Сохраняются ли NSUserDefaults через обновление в приложении в App Store?

Это так? Получают ли NSUserDefaults reset, когда вы отправляете обновление в приложение в App Store, или они reset?

Мое приложение сбой при обновлении, но не сбой при загрузке полностью - поэтому я пытаюсь определить, что может быть различным в обновленном сеансе для только что загруженного сеанса.

Cheers, Ник.

Ответ 1

Обычно они не reset, если пользователь не удалит приложение. Для базовых данных NSUserDefaults - лучший способ сохранить данные, такие как предпочтения, даты, строки и т.д. Если вы хотите сохранить изображения и файлы, файловая система будет лучше.

Ответ 2

Я верю, что ответ ДА, он будет сохраняться. Это также полностью описано в главе "Каталог приложений" в Руководстве по программированию Apple iPhone OS.

Ответ 3

  • Прямой ответ на поставленный вопрос: ДА.
  • Ваша проблема: Из-за логических проблем ваше приложение разбивается. Предположим, вы храните объект по умолчанию, и приложение проверяет его значение при запуске (или в другом месте). В вашем обновлении вы можете изменить способ его проверки или использования, например. вы ожидаете значение, но объект равен нулю или наоборот. Это может вызвать SIGABRT или EXC_BAD_ACCESS.

Ответ 4

Если у вас была модель CoreData, и вы что-то изменили в своей модели и обновили, не управляя миграцией, возможно, причина, по которой ваше приложение падает при обновлении...

Ответ 5

У меня есть аналогичный опыт. Наше приложение хранит номер версии в разделе "Настройки .Bundle/Root.Plist". Это отображается в приложении iPhone Settings. Мы обнаружили, что при установке номер версии загружается из пакета приложений, поэтому номер версии правильный. Однако при обновлении номер версии не изменяется. Это создает впечатление, что пользователь запускает предыдущую версию приложения. У нас нет никакой логики, связанной с номером версии, она просто для отображения (она может использоваться персоналом контакт-центра при диагностике сбоев).

Наш опыт NSUserDefaults не очищается, когда пользователь обновляет наше приложение, но экран настроек также не обновляется.

Ответ 6

Помните об этом случае, когда ваше приложение работает в фоновом режиме, и вы не можете получить доступ к сохраненным значениям в NSUserDefaults:

Эрик:

Было много потоков и ошибок по этому поводу, но это происходит со мной снова в ios 9. У меня есть приложение, которое запускается в фоновом режиме в ответ на задачи NSURLSession и толчки, доступные для содержимого. Воспроизводимо, если я перезагружаю свой телефон и жду фонового запуска моего приложения, то при открытии приложения я обнаруживаю, что [[NSUserDefaults standardUserDefaults] dictionaryRepresentation] содержит все системные значения, например, AppleITunesStoreItemKinds и т.д., Но не содержит значений, которые я установил. Если я принудительно завершу работу и перезапущу приложение, все мои ценности вернутся. Есть ли способ избежать кеширования "пустых" стандартных пользовательских настроек до того, как телефон разблокирован, или, по крайней мере, определить, когда они испортились, и исправить их без принудительного выхода из приложения?

Эскимос ([email protected]):

Проблема здесь в том, что NSUserDefaults в конечном итоге поддерживается файлом в контейнере приложений, а ваш контейнер приложений защищен данными. Если вы не делаете ничего особенного, то в iOS 7 и более поздних версиях ваш контейнер использует NSFileProtectionCompleteUntilFirstUserAuthentication, значение, которое наследуется резервным хранилищем NSUserDefaults, и поэтому вы не можете получить к нему доступ до первой разблокировки.

IMO лучший способ избежать этого - избегать NSUserDefaults для вещей, на которые вы полагаетесь в путях кода, которые могут выполняться в фоновом режиме. Вместо этого сохраните эти настройки в своем собственном файле настроек, файл которого вы можете явно защищать (в данном случае это означает "установить NSFileProtectionNone").

Есть две проблемы с NSUserDefaults в контексте защиты данных:

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

Примечание. В последних версиях OS X NSUserDefaults управляется демоном, и люди, которые пытаются напрямую манипулировать его резервным хранилищем, столкнулись с проблемами. Легко представить, что в какой-то момент на iOS появятся подобные вещи.

Даже если изменение защиты данных было возможно, NSUserDefaults не имеет механизма для классификации данных на основе контекста, в котором вы их используете; это все или ничего API. В вашем случае вы не хотите снимать защиту со всех пользовательских настроек по умолчанию, а только тех, к которым вам нужен доступ в фоновом режиме перед первой разблокировкой.

Наконец, если какие-либо из этих данных действительно конфиденциальны, вы должны поместить их в цепочку для ключей. Примечательно, что брелок имеет возможность устанавливать защиту данных для каждого элемента в отдельности.

Источник:https://webcache.googleusercontent.com/search?q=cache:sR9eZNHpZtwJ:https://forums.developer.apple.com/thread/15685