¿NSUserDefaults persiste a través de una actualización de una aplicación en la Appstore?

106

¿Es este el caso? ¿Se restablecen NSUserDefaults cuando envía una actualización a una aplicación en la App Store, o se restablecen?

Mi aplicación se bloquea cuando se actualiza, pero no cuando se descarga por completo, por lo que estoy tratando de determinar qué podría ser diferente en la sesión actualizada a la sesión recién descargada.

Saludos, Nick.

Nick Cartwright
fuente
Los archivos en Documentos y Biblioteca se conservarán como afirma la documentación: developer.apple.com/library/ios/#DOCUMENTATION/iPhone/…
Geri Borbás

Respuestas:

116

Por lo general, no se restablecen a menos que el usuario elimine la aplicación. Para datos básicos, NSUserDefaults es la mejor manera de guardar datos como preferencias, fechas, cadenas, etc. Si está buscando guardar imágenes y archivos, el sistema de archivos es una mejor opción.

coneybeare
fuente
5
¿En algún lugar de la documentación de Apple se menciona esto?
Nick Cartwright
1
Lo siento, ¡olvidé agradecerte por tu rápida respuesta! - Si alguien puede encontrar un enlace a cualquier forma de documentación de Apple que diga esto, sería excelente ... En la documentación de NSUserDefaults no dice nada sobre esto, así que creo que había asumido (incorrectamente) que los valores predeterminados se borraron. ¡Seguramente esta parece la forma más segura para que Apple actualice aplicaciones!
Nick Cartwright
Puede que sea la forma más segura, pero sería increíblemente molesto para los usuarios si tuvieran que volver a configurar todas sus preferencias cada vez que se actualiza una aplicación. Generalmente tengo tres o cuatro actualizaciones de aplicaciones por día; Estoy seguro de que otros usuarios de iPhone tienen aún más. Limpiar las preferencias para cada actualización básicamente inutilizaría mi iPhone.
Kristopher Johnson
1
Los datos de la carpeta de documentos pueden desaparecer con la misma facilidad que NSUserDefaults. Sin embargo, ambas son ocasiones raras y no tienen absolutamente nada que ver con el proceso de actualización normal
coneybeare
1
Gracias Kristopher, y sí, estoy de acuerdo. Mi problema era que había usado NSUserDefaults para almacenar eventos programáticos y confiaba en que se restablecieran cuando se instalaba la aplicación. Todas mis pruebas en el dispositivo iPhone (y las pruebas de Apples) probaron la aplicación como una nueva instalación. Sin ninguna documentación o forma de probar como actualización, no pude repetir el bloqueo de actualización que todos nuestros clientes están experimentando. En resumen, probablemente una lección aprendida de la manera más difícil.
Nick Cartwright
7

Creo que la respuesta es SÍ, persistirá. Esto también está completamente documentado en el capítulo Directorio de aplicaciones en la Guía de programación de Apple iPhone OS.

León
fuente
4
  1. Respuesta directa a la pregunta publicada: SÍ.
  2. Tu problema: tu aplicación se bloquea debido a problemas de lógica. Suponga que almacena un objeto en los valores predeterminados y la aplicación verifica su valor en el lanzamiento (o en otro lugar). En la actualización, puede cambiar la forma en que se verifica o usa, por ejemplo, espera un valor, pero el objeto es nulo, o viceversa. Esto puede causar un SIGABRT o EXC_BAD_ACCESS.
John Smith
fuente
2

Si tenía el modelo CoreData y cambió algo en su modelo y actualización, sin administrar la migración, esa es probablemente la razón por la que su aplicación falla en la actualización ...

Bojan Bozovic
fuente
Esperaría que pudiera ser un caso :) no un NSUserdefault
Julian Król
1

Tengo una experiencia similar. Nuestra aplicación almacena un número de versión en Settings.Bundle / Root.Plist. Esto se muestra a través de la aplicación de configuración de iPhone. Lo que encontramos es que en una instalación, el número de versión se carga desde el paquete de la aplicación, por lo tanto, el número de versión es correcto. Sin embargo, en una actualización, el número de versión no cambia. Esto da la impresión de que el usuario está ejecutando una versión anterior de la aplicación. No tenemos ninguna lógica vinculada al número de versión, es solo para mostrar (podría ser utilizada por el personal del centro de contacto al diagnosticar fallas).

Nuestra experiencia es que NSUserDefaults no se borra cuando un usuario actualiza nuestra aplicación, pero la pantalla de Configuración tampoco se actualiza.

Derek Knight
fuente
0

Tenga en cuenta este caso, cuando su aplicación se ejecuta en segundo plano y no puede acceder a sus valores almacenados en NSUserDefaults:

Eric:

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?

Esquimal ([email protected]):

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.

Fuente: https://webcache.googleusercontent.com/search?q=cache:sR9eZNHpZtwJ:https://forums.developer.apple.com/thread/15685

Gran M
fuente