Tenga en cuenta este caso, cuando su aplicación se ejecuta en segundo plano y no puede acceder a sus valores almacenados en NSUserDefaults:
Ha habido muchos hilos y errores sobre esto, pero me está sucediendo nuevamente en ios 9. Tengo una aplicación que se inicia en segundo plano en respuesta a las tareas de NSURLSession y los empujes de contenido disponible. De forma reproducible, si reinicio mi teléfono y espero que se inicie mi aplicación en segundo plano, cuando abro la aplicación encuentro que [[NSUserDefaults standardUserDefaults] dictionaryRepresentation] contiene todos los valores del sistema, por ejemplo, AppleITunesStoreItemKinds, etc. pero no contiene cualquiera de los valores que he establecido. Si fuerzo el cierre y reinicio la aplicación, todos mis valores vuelven. ¿Hay alguna forma de evitar que almacene en caché los valores predeterminados de usuario estándar "vacíos" antes de que se desbloquee el teléfono, o al menos para determinar cuándo están en mal estado y solucionarlos sin tener que forzar el cierre de la aplicación?
El problema aquí es que NSUserDefaults está respaldado en última instancia por un archivo en el contenedor de su aplicación y el contenedor de su aplicación está sujeto a protección de datos. Si no hace nada especial, en iOS 7 y versiones posteriores, su contenedor usa NSFileProtectionCompleteUntilFirstUserAuthentication, un valor que hereda del almacén de respaldo NSUserDefaults, por lo que no puede acceder a él antes del primer desbloqueo.
En mi opinión, la mejor manera de evitar esto es evitar NSUserDefaults para las cosas en las que confía en las rutas de código que se pueden ejecutar en segundo plano. En su lugar, almacene esas configuraciones en su propio archivo de preferencias, uno cuya protección de datos puede administrar explícitamente (en este caso, eso significa 'establecido en NSFileProtectionNone').
Hay dos problemas con NSUserDefaults en un contexto de protección de datos:
Es una API completamente abstracta: la presencia y ubicación de su almacén de respaldo no se considera parte de esa API, por lo que no puede administrar explícitamente su protección de datos.
Nota En las versiones recientes de OS X, NSUserDefaults es administrado por un demonio y las personas que intentan manipular su almacén de respaldo directamente se han encontrado con problemas. Es fácil imaginar que el mismo tipo de cosas llegará a iOS en algún momento.
Incluso si fuera posible cambiar la protección de datos, NSUserDefaults no tiene ningún mecanismo para clasificar los datos según el contexto en el que los está utilizando; es una API de "todo o nada". En su caso, no desea eliminar la protección de todos sus valores predeterminados de usuario, solo aquellos a los que necesita acceder en segundo plano antes del primer desbloqueo.
Finalmente, si alguno de estos datos es realmente sensible, debe ponerlo en el llavero. En particular, el llavero tiene la capacidad de configurar la protección de datos artículo por artículo.