Чи зберігаються NSUserDefaults через оновлення програми в Appstore?


106

Це так? Чи скидаються NSUserDefaults, коли ви надсилаєте оновлення до програми в App Store, або вони скидаються?

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

Ура, Нік.


Файли в документах , і бібліотека буде збережена в якості вимог до документації: developer.apple.com/library/ios/#DOCUMENTATION/iPhone / ...
Джері Borbás

Відповіді:


116

Зазвичай вони не скидаються, якщо користувач не видаляє додаток. Для основних даних NSUserDefaults - це найкращий спосіб збереження даних, таких як налаштування, дати, рядки тощо. Якщо ви хочете зберегти зображення та файли, файлова система - це краща ставка.


5
Чи є десь у документації Apple про це згадується?
Нік Картрайт

1
Вибачте - я забув подякувати за вашу швидку відповідь! - Якщо хтось може знайти посилання на будь-яку форму документації Apple, яка говорить про це, було б чудово .... У документації для NSUserDefaults про це нічого не сказано, тому я думаю, що я (неправильно) припускав, що за замовчуванням буде стерто. Це здавалося б найбезпечнішим способом для Apple, безумовно, оновити додатки!
Нік Картрайт

Це може бути найбезпечнішим способом, але користувачам було б неймовірно дратувати, якби їм довелося повторно встановлювати всі свої вподобання щоразу, коли додаток оновлювався. У мене зазвичай три або чотири оновлення додатків на день; Я впевнений, що інші користувачі iPhone мають ще більше. Вибір параметрів для кожного оновлення в основному зробить мій iPhone непридатним.
Крістофер Джонсон

1
Дані в папці документів можуть зникати так само легко, як і NSUserDefaults. Однак вони обидва є рідкісними випадками і абсолютно не мають нічого спільного з нормальним процесом оновлення
coneybeare

1
Дякую Крістоферу - і так, я згоден. Моя проблема полягала в тому, що я використовував NSUserDefaults для зберігання програмних подій і покладався на їх скидання при встановленні програми. Усі мої тестування на пристрої iPhone (і тестування яблук) перевіряли додаток як нову установку. Не маючи жодної документації чи способу тестування як оновлення, я не зміг повторити збій оновлення, який відчувають усі наші клієнти. Підводячи підсумок - напевно, урок засвоїли важкий шлях !!
Нік Картрайт

7

Я вважаю, що відповідь ТАК, вона буде зберігатися. Це також повністю задокументовано в розділі Довідник додатків у Посібнику з програмування Apple iPhone OS.


4
  1. Пряма відповідь на розміщене питання: ТАК.
  2. Ваша проблема: Ваш додаток виходить з ладу через проблеми з логікою. Припустимо, ви зберігаєте об’єкт за замовчуванням, і додаток перевіряє його значення при запуску (або в іншому місці). Під час оновлення ви можете змінити спосіб його перевірки або використання, наприклад, очікуєте значення, але об'єкт є нульовим або навпаки. Це може спричинити SIGABRT або EXC_BAD_ACCESS.

2

Якщо у вас була модель CoreData, і ви щось змінили у вашій моделі та оновлення, не керуючи міграцією, це, мабуть, причина, через яку ваш додаток виходить з ладу при оновленні ...


Я б очікував, що це може бути справа :) не NSUserdefault
Julian Król

1

Я маю подібний досвід. Наш додаток зберігає номер версії у Settings.Bundle / Root.Plist. Це відображається через додаток Налаштування iPhone. Ми виявляємо, що під час встановлення номер версії завантажується з пакету додатків, тому номер версії є правильним. Щодо оновлення, однак номер версії не змінюється. Це створює враження, що користувач працює з попередньою версією програми. У нас немає ніякої логіки, пов'язаної з номером версії, це лише для відображення (його можуть використовувати співробітники контактного центру при діагностиці несправностей).

Наш досвід полягає в тому, що NSUserDefaults не видаляється, коли користувач оновлює наш додаток, але дисплей налаштувань також не оновлюється.


0

Будьте в курсі цього випадку, коли ваша програма працює у фоновому режимі, і ви не можете отримати доступ до збережених значень у NSUserDefaults:

Ерік:

Про це було багато потоків і помилок, але зі мною це повторюється в ios 9. У мене є додаток, який запускається у фоновому режимі у відповідь на завдання NSURLSession та доступні контенти. Якщо я перезавантажую телефон і чекаю, коли відбудеться фонове запуск мого додатка, тоді, коли я відкриваю програму, я виявляю, що [[NSUserDefaults standardUserDefaults] словникRepresentation] містить усі системні значення, наприклад AppleITunesStoreItemKinds тощо, але не містить будь-яке із встановлених мною значень. Якщо я змушу вийти з програми та перезапустити додаток, усі мої значення повернуться. Чи є якийсь спосіб уникнути кешування «порожнього» standardUserDefaults до того, як телефон буде розблокований, або принаймні визначити, коли вони заплутані та виправити їх, не змушуючи примусово закривати додаток?

Ескімоська (eskimo1@apple.com):

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

ІМО найкращий спосіб уникнути цього - уникати 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.