Будьте в курсі цього випадку, коли ваша програма працює у фоновому режимі, і ви не можете отримати доступ до збережених значень у NSUserDefaults:
Про це було багато потоків і помилок, але зі мною це повторюється в ios 9. У мене є додаток, який запускається у фоновому режимі у відповідь на завдання NSURLSession та доступні контенти. Якщо я перезавантажую телефон і чекаю, коли відбудеться фонове запуск мого додатка, тоді, коли я відкриваю програму, я виявляю, що [[NSUserDefaults standardUserDefaults] словникRepresentation] містить усі системні значення, наприклад AppleITunesStoreItemKinds тощо, але не містить будь-яке із встановлених мною значень. Якщо я змушу вийти з програми та перезапустити додаток, усі мої значення повернуться. Чи є якийсь спосіб уникнути кешування «порожнього» standardUserDefaults до того, як телефон буде розблокований, або принаймні визначити, коли вони заплутані та виправити їх, не змушуючи примусово закривати додаток?
Проблема тут полягає в тому, що NSUserDefaults в кінцевому рахунку підтримується файлом у контейнері вашого додатка, і контейнер додатка підлягає захисту даних. Якщо ви нічого не робите, тоді на iOS 7 та пізніших версіях ваш контейнер використовує NSFileProtectionCompleteUntilFirstUserAuthentication - значення, яке успадковується резервним магазином NSUserDefaults, і тому ви не можете отримати доступ до нього до першого розблокування.
ІМО найкращий спосіб уникнути цього - уникати NSUserDefaults для матеріалів, на які ви покладаєтесь у кодових шляхах, які можна виконати у фоновому режимі. Замість цього зберігайте ці налаштування у вашому власному файлі налаштувань, тим, чиї захист даних ви можете явно керувати (у цьому випадку це означає "встановлено на NSFileProtectionNone").
У контексті захисту даних є дві проблеми з NSUserDefaults:
Його повністю абстрактний API: наявність та розташування його резервного сховища не вважається частиною цього API, тому ви не можете чітко керувати його захистом даних.
Примітка. В останніх версіях OS X NSUserDefaults керує демон, і люди, які намагаються безпосередньо маніпулювати її резервним сховищем, стикаються з проблемами. Неважко уявити собі таку саму річ, яка надходить до iOS у якийсь момент.
Навіть якщо зміна захисту даних була можливою, NSUserDefaults не має механізму класифікації даних на основі контексту, в якому ви їх використовуєте; це API "все або нічого". У вашому випадку ви не хочете видаляти захист від усіх стандартних налаштувань користувачів, лише тих, до яких вам потрібно отримати доступ у фоновому режимі, перш ніж розблокувати.
Нарешті, якщо будь-який з цих даних є справді чутливим, вам слід покласти його в брелок. Зокрема, брелок має можливість встановлювати захист даних за окремими ознаками.