web-dev-qa-db-fra.com

Quelle est la permanence du stockage local sur Android et iOS?

Lorsque mon application stocke des données localement sur un téléphone, dans quelle mesure ce stockage est-il permanent? Je vais élaborer la situation exacte:

Je construis une application avec jQueryMobile et Phonegap. C'est essentiellement une application de navigateur, mais Phonegap me permet de la conditionner et de la vendre dans les magasins d'applications, entre autres avantages.

Phonegap propose deux modes de stockage. Les deux fonctions permettent d'harmoniser les fonctions natives des systèmes d'exploitation iOS, Android, Blackberry et d'autres systèmes d'exploitation: localStorage (paires primitives clé-valeur) et une base de données Web SQL. LocalStorage et Web SQL sont des formes de stockage appartenant au navigateur. Cela dit, je ne peux pas savoir combien de temps les données resteront stockées, dans quelles circonstances elles seront supprimées, dans quelles circonstances elles pourraient ne pas être disponibles, etc.

Par exemple, si l'application stocke des données avec localStorage ou Web SQL et que l'utilisateur bascule sur un autre navigateur standard sous Android, l'application sera-t-elle ouverte avec le nouveau navigateur et cela signifie-t-il que les données stockées sont indisponibles?

Si l'utilisateur n'utilise pas l'application pendant un an (ce qui dans mon cas est réaliste et pas nécessairement un mauvais scénario), les données auront-elles expiré comme un cookie, ou auront peut-être été chassées de la mémoire du navigateur par un déluge de données d'autres applications?

Ou les données seront-elles détruites même plus tôt, par exemple lorsque: - l'utilisateur visite un autre site dans le navigateur - le navigateur est fermé manuellement - le processus du navigateur est tué ou meurt - etc.

Ou localStorage et Web SQL sont-ils le type de stockage que vous ne supprimez que lorsque (sous Android), accédez à Paramètres> Applications et supprimez activement les données utilisateur associées à l'application?

Merci pour toutes les idées. Il n'y a rien d'informatif sur le Web.

Que se passe-t-il dans le cas de la mise à jour de l'application? Le stockage local et Web sera supprimé ou restera-t-il?

72
Wytze

Permettez-moi de vous répondre étape par étape

si l'application stocke des données avec localStorage ou Web SQL, et avec l'utilisateur passe à un autre navigateur standard sur leur Android, le app être ouvert avec le nouveau navigateur et cela signifie-t-il que le. enregistré. les données sont indisponibles?

Les données sont enregistrées dans le 'cache' (ce n'est pas exactement le cache) du navigateur. Ainsi, si vous modifiez le navigateur ou définissez les paramètres de sorte que le navigateur par défaut soit supprimé ou modifié, les données disparaîtront.

Si l'utilisateur n'utilise pas l'application pendant un an (ce qui dans mon cas est réaliste. Ce n'est pas nécessairement un mauvais scénario), les données disposeront-elles de expiré comme un cookie, ou peut-être été expulsé du navigateur stockage par un déluge de données provenant d'autres applications?

Non, les données y resteront quelle que soit la durée pendant laquelle elles ne sont pas utilisées. Ainsi, même si vous effacez le cache du navigateur, il sera toujours là.

Ou les données seront-elles détruites même avant, par exemple lorsque: - l'utilisateur visite un autre site dans le navigateur - le navigateur est fermé manuellement - processus du navigateur est tué ou meurt - etc

Non, les données restent correctes. :-)

Ou localStorage et Web SQL sont-ils le type de stockage que vous utilisez uniquement supprimer lorsque (sous Android), vous accédez à Paramètres> Applications et supprimez activement les données d'utilisateur associées à l'application?

Oui, les données ne sont disponibles que si vous les supprimez manuellement de votre application ou si vous désinstallez votre application. Il restera dans tous les autres cas.

EDIT: Dans le cas d'iOS, le système d'exploitation supprimera les données du stockage local en cas de manque de mémoire dans l'appareil. 

56
ghostCoder

Depuis iOS 5.1, la réponse de @ ghostCoder n'est plus valide. Apple a décidé de déplacer l'emplacement de stockage local dans un dossier de cache pouvant être vidé à tout moment. Vous pouvez suivre cette discussion ici:

Discussion de Google Groupes sur Localstorage

Ce blog explique également le problème plus en détail:

http://www.marco.org/2011/10/13/ios5-caches-cleaning

Il est possible de pointer manuellement votre emplacement de stockage local vers un emplacement sûr Application_Home>/Documents. Pour déterminer votre emplacement de stockage local actuel, vous pouvez utiliser quelque chose comme ceci:

NSString* localStorageSubdir = (IsAtLeastiOSVersion(@"5.1")) ? @"Caches" : @"WebKit/LocalStorage";
NSString* localStoragePath = [library stringByAppendingPathComponent:localStorageSubdir];
NSString* localStorageDb = [localStoragePath stringByAppendingPathComponent:@"file__0.localstorage"];

Le code suivant vous permet de définir un autre emplacement pour votre stockage 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];
} 
36
dvtoever

Essayez le plugin NativeStorage. https://www.npmjs.com/package/cordova-plugin-nativestorage .

Il a défini, mis en place et récupéré des fonctions qui implémentent des fonctionnalités de plate-forme telles que les préférences partagées Android et iOS NSUserDefaults, qui rendent le magasin de données aussi sûr que possible.

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>);
5
user4466709

Sur Android c'est un stockage permanent par défaut. Même si l'utilisateur met à jour votre application, celle-ci reste la même.

L'utilisateur peut accéder aux paramètres et vider le cache et les données, auquel cas il le fait ou si l'une des applications de nettoyage le fait. 

Même sur iOS c'est un stockage permanent, mais je ne connais pas le scénario de mise à jour de l'application. Mais dans la version précédente (5.1), ce n’était pas le cas et dans la version 6+, il était possible de le rendre permanent grâce à un drapeau activé rapidement par cordova/phonegap.

3
aWebDeveloper

Une bonne solution disponible maintenant est Le plugin Cordova Native Storage .

Il permet une méthode simple mais persistante pour la sauvegarde de données dans iOS et Android en implémentant de manière native SharedPreferences dans Android et NSDefault dans iOS pour garantir la fiabilité.

Usage:

Installation:

cordova plugin add cordova-plugin-nativestorage

Mémorisation des valeurs:

NativeStorage.setItem("reference_to_value",<value>,<success-callback>, <error-callback>);

Récupération des valeurs:

NativeStorage.getItem("reference_to_value",<success-callback>, <error-callback>);
3
Iceman

Je ne peux pas parler pour d'autres plates-formes, mais sur mon appareil Android 4.1, j'utilise localStorage pour stocker des données localement avec jQuery Mobile, et j'ai découvert qu'Android effacerait mon cache toutes les semaines à mon insu. Je vais essayer Web SQL et voir si c'est mieux.

1
qJake

J'ai trouvé ceci en ligne ng-persist

Stocker des données sur des appareils mobiles (à l’aide de cordova) qui persistent même si le l'utilisateur réinstalle l'application

Installer

bower install ng-persist ngstorage --save

Injectez $persist dans votre contrôleur

.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
        });

});
0
niksmac

Il serait préférable, en termes de performances, de sécurité et de fiabilité, de &EACUTE;VITER d’utiliser le stockage local et d’utiliser Cordova-sqlite-storage .

Quelques notes:

localStorage a l'avantage d'être facile à utiliser, mais fonctionne de manière synchrone. Cela signifie qu'il peut verrouiller le thread d'interface utilisateur et nuire aux performances.

localStorage a une quantité de stockage limitée, généralement 5Mo.

localStorage peut être effacé à tout moment par le système d'exploitation (Android, iOS). C'est vraiment grave si vous vous souciez de la persistance des données.

D'autre part:

Cordova-sqlite-storage est asynchrone et ne bloque pas le thread d'interface utilisateur, il enregistre vos données sur le stockage de l'appareil natif, la quantité de stockage n'est pas limitée, le système d'exploitation ne supprimera aucune de vos données, sauf si vous désinstallez l'application.

0
Akis Tofas