cordova - example - ¿Qué tan permanente es el almacenamiento local en Android e iOS?
ionic native storage (8)
Cuando mi aplicación almacena datos localmente en un teléfono, ¿qué tan permanente es ese almacenamiento? Elaboraré la situación exacta:
Estoy construyendo una aplicación con jQueryMobile y Phonegap. Básicamente es una aplicación de navegador, pero el uso de Phonegap me permite empaquetarlo y venderlo en las tiendas de aplicaciones, entre otras ventajas.
Phonegap ofrece dos formas de almacenamiento, ambas funciones armonizan las funciones nativas de iOs, Android, Blackberry y algunos otros SO: localStorage (que son pares primitivos de clave-valor) y una base de datos Web SQL. Tanto localStorage como SQL web son formas de almacenamiento que pertenecen al navegador. Una vez dicho esto, no puedo saber cuánto tiempo permanecerán almacenados los datos, en qué circunstancias se eliminarán, en qué circunstancias puede no estar disponible, etc.
Por ejemplo, si la aplicación almacena datos con localStorage o web SQL, y el usuario cambia a un navegador estándar diferente en su Android, ¿se abrirá la aplicación con el nuevo navegador y eso significa que los datos almacenados no están disponibles?
Si el usuario no usa la aplicación durante un año (que en mi caso es un escenario realista y no necesariamente malo), ¿los datos han expirado como una cookie, o tal vez han sido expulsados del almacenamiento del navegador por un diluvio de datos de otras aplicaciones?
¿O se destruirán los datos incluso antes, como cuando: el usuario visita otro sitio en el navegador? El navegador se cierra manualmente, el proceso del navegador se cancela o muere, etc.
¿O son localStorage y SQL web el tipo de almacenamiento que solo elimina cuando (en Android) va a Configuración> Aplicaciones y elimina activamente los datos de usuario asociados con la aplicación?
Gracias por cualquier idea. No hay nada informativo en el viejo WWW.
Qué pasa en el caso de la actualización de la aplicación. El almacenamiento local y web será eliminado o se mantendrá?
A partir de iOS 5.1 @ la respuesta de ghostCoder ya no es válida. Apple ha decidido mover la ubicación de almacenamiento local a una carpeta de caché que se puede vaciar en cualquier momento. Puedes seguir esta discusión aquí:
Discusión de Grupos de Google sobre Localstorage
También este blog explica el problema con más detalle:
http://www.marco.org/2011/10/13/ios5-caches-cleaning
Es posible señalar manualmente la ubicación de almacenamiento local a una ubicación segura de Inicio de aplicación> / Documentos . Para determinar su ubicación actual de almacenamiento local, puede usar algo como esto:
NSString* localStorageSubdir = (IsAtLeastiOSVersion(@"5.1")) ? @"Caches" : @"WebKit/LocalStorage";
NSString* localStoragePath = [library stringByAppendingPathComponent:localStorageSubdir];
NSString* localStorageDb = [localStoragePath stringByAppendingPathComponent:@"file__0.localstorage"];
El siguiente código le permite establecer otra ubicación para su almacenamiento local:
NSString* bundleIdentifier = [[mainBundle infoDictionary] objectForKey:@"CFBundleIdentifier"];
NSString* libraryPreferences = @"Library/Preferences";
NSString* appPlistPath = [[bundlePath stringByAppendingPathComponent:libraryPreferences] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist", bundleIdentifier]];
NSString *value;
NSString *key = @"WebKitLocalStorageDatabasePathPreferenceKey";
value = [appPlistDict objectForKey: key];
if (![value isEqual:ourLocalStoragePath]) {
[appPlistDict setValue:yourPreferredLocalStoragePath forKey:key];
}
Déjame responder paso a paso
si la aplicación almacena datos con localStorage o SQL web, y el usuario cambia a un navegador estándar diferente en su Android, ¿se abrirá la aplicación con el nuevo navegador y eso significa que los datos almacenados no están disponibles?
Los datos se guardan en el "caché" (no es exactamente el caché) del navegador, por lo que si cambia el navegador o establece la configuración para que se elimine o cambie el navegador predeterminado, los datos se irán.
Si el usuario no usa la aplicación durante un año (que en mi caso es un escenario realista y no necesariamente malo), ¿los datos han expirado como una cookie, o tal vez han sido expulsados del almacenamiento del navegador por un diluvio de datos de otras aplicaciones?
No, los datos permanecerán allí sin importar por cuánto tiempo no se usen. Por lo tanto, incluso si borra el caché del navegador, aún estará allí.
¿O se destruirán los datos incluso antes, como cuando: el usuario visita otro sitio en el navegador? El navegador se cierra manualmente, el proceso del navegador se cancela o muere, etc.
No, la información se mantiene bien. :-)
¿O son localStorage y SQL web el tipo de almacenamiento que solo elimina cuando (en Android) va a Configuración> Aplicaciones y elimina activamente los datos de usuario asociados con la aplicación?
Sí, los datos solo se guardan si lo elimina manualmente de su aplicación o si desinstala su aplicación. Permanecerá en todos los demás casos.
EDITAR: En el caso de iOS, el sistema operativo eliminará los datos en el almacenamiento local cuando haya una escasez de memoria en el dispositivo.
En Android es un almacenamiento permanente por defecto. Incluso si el usuario actualiza su aplicación, permanece igual.
El usuario puede ir a la configuración y borrar la caché y los datos, en cuyo caso se va o si dice que una de las aplicaciones de limpieza lo hace.
Incluso en iOS es un almacenamiento permanente, pero no conozco el escenario de actualización de la aplicación. Pero en la versión anterior (5.1) no era así y en 6+ hicieron que se pueda hacer permanente a través de una bandera que fue habilitada rápidamente por cordova / phonegap.
Encontré este ng-persist
Almacenar datos en dispositivos móviles (usando cordova) que persisten incluso si el usuario reinstala la aplicación
Instalar
bower install ng-persist ngstorage --save
Inyectar $persist
en su controlador
.controller(''MyCtrl'', function($persist) {
$persist
.set(namespace, key, val)
.then(function () {
// saved
});
// read
$persist
.get(namespace, key, fallback)
.then(function (val) {
// val is either the value, if exists, or the fallback
});
// delete
$persist
.remove(namespace, key)
.then(function () {
// removed
});
});
No puedo hablar por otras plataformas, pero en mi dispositivo Android 4.1, estoy usando localStorage para almacenar algunos datos localmente con jQuery Mobile, y he descubierto que Android borrará mi caché cada semana más o menos sin mi conocimiento. Voy a probar Web SQL y ver si eso es mejor.
Pruebe el plugin NativeStorage. https://www.npmjs.com/package/cordova-plugin-nativestorage .
Ha establecido, puesto y obtenido funciones que implementan capacidades de plataforma como las preferencias compartidas de Android y NSUserDefaults de iOS, lo que hace que el almacenamiento de datos sea lo más seguro posible.
cordova plugin add cordova-plugin-nativestorage
NativeStorage.putObject("reference_to_value",<object>, <success-callback>, <error-callback>);
NativeStorage.getObject("reference_to_value",<success-callback>, <error-callback>);
Sería mejor en términos de rendimiento, seguridad y confiabilidad EVITAR el uso de almacenamiento local y usar Cordova-sqlite-storage
lugar.
Algunas notas:
localStorage
tiene la ventaja de ser fácil de usar, pero funciona de forma síncrona. Esto significa que puede bloquear el hilo de la interfaz de usuario y causar un rendimiento lento.
localStorage
tiene una cantidad limitada de almacenamiento, generalmente es de 5mb.
localStorage
puede ser borrado por el sistema operativo (Android, iOS) en cualquier momento. Esto es realmente serio si te preocupa la persistencia de los datos.
Por otra parte:
Cordova-sqlite-storage
es asíncrono y no bloquea el hilo de UI, guarda sus datos en el almacenamiento del dispositivo nativo, la cantidad de almacenamiento no está limitada, el sistema operativo no eliminará ninguno de sus datos, a menos que desinstale la aplicación.
Una buena solución que está disponible ahora es github.com/TheCocoaProject/cordova-plugin-nativestorage .
Permite un método persistente simple pero nativo para guardar datos en iOS y Android implementando de forma nativa SharedPreferences en Android y NSDefault en iOS para garantizar la fiabilidad.
Uso:
Instalación:
cordova plugin add cordova-plugin-nativestorage
Almacenamiento de valores:
NativeStorage.setItem("reference_to_value",<value>,<success-callback>, <error-callback>);
Recuperando valores:
NativeStorage.getItem("reference_to_value",<success-callback>, <error-callback>);