82 votes

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

Lorsque mon application stocke des données localement sur un téléphone, quelle est la durée de ce stockage ? Je vais vous expliquer la situation exacte :

Je suis en train de construire une application avec jQueryMobile et Phonegap. Il s'agit essentiellement d'une application pour navigateur, mais l'utilisation de Phonegap me permet de l'emballer et de la vendre dans les magasins d'applications, entre autres avantages.

Phonegap propose deux modes de stockage, dont les fonctions s'harmonisent avec les fonctions natives de iOs, Android, Blackberry et quelques autres OS : localStorage (qui est constitué de paires primitives clé-valeur), et une base de données SQL Web. Tant localStorage que Web SQL sont des formes de stockage qui appartiennent au navigateur. Cela dit, je n'arrive pas à savoir combien de temps les données resteront stockées, dans quelles circonstances elles seront supprimées, dans quelles circonstances elles ne seront pas disponibles, etc.

Par exemple, si l'application stocke des données avec localStorage ou web SQL, et que l'utilisateur passe à un autre navigateur standard sur son 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 un scénario réaliste et pas nécessairement mauvais), les données auront-elles expiré comme un cookie, ou auront-elles été expulsées du stockage du navigateur par un déluge de données provenant d'autres applications ?

Ou bien les données seront-elles détruites encore 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 bien est-ce que localStorage et web SQL sont le type de stockage que vous ne supprimez que lorsque (dans Android) vous allez dans Paramètres > Apps et supprimez activement les données utilisateur associées à l'application ?

Merci pour toute information. Il n'y a rien d'informatif sur le vieux WWW.

Que se passe-t-il en cas de mise à jour de l'application. Le stockage local et web sera-t-il supprimé ou restera-t-il ?

60voto

ghostCoder Points 4069

Laissez-moi répondre étape par étape

si l'application stocke les données avec localStorage ou web SQL, et que l'utilisateur utilisateur passe à un autre navigateur standard sur son Android, l'application sera-t-elle l'application sera-t-elle ouverte avec le nouveau navigateur et cela signifie-t-il que les données stockées ne sont pas disponibles ?

Les données sont sauvegardées dans le "cache" (ce n'est pas exactement le cache) du navigateur, donc si vous changez de navigateur, ou si vous configurez les paramètres de manière à ce 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 un scénario réaliste et pas nécessairement un mauvais scénario), les données auront-elles données auront-elles expiré comme un cookie, ou peut-être auront-elles été poussées hors du du navigateur par un déluge de données provenant d'autres applications ?

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

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

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

Ou bien est-ce que localStorage et web SQL sont le type de stockage que vous ne pouvez supprimer que lorsque (dans Android) vous allez dans Paramètres > Apps et supprimez activement les données utilisateur associées à l'application ?

Oui, les données ne disparaissent que si vous les supprimez manuellement de votre application ou si vous désinstallez votre application. Elles restent dans tous les autres cas.

EDIT : Dans le cas d'iOS, le système d'exploitation supprime les données du stockage local lorsqu'il y a un manque de mémoire dans l'appareil.

0 votes

Attends, tu ne peux pas changer le chromeview/webview en quelque chose d'autre de ton application Cordova, ou bien tu peux ?

0 votes

Cette question est plus théorique que pratique, donc je n'ai pas de code à montrer pour cela.J'utilise une application PWA sur les mobiles et je stocke les données dans le stockage local. jusqu'ici tout va bien. Mais si je force l'effacement (retirer l'application de l'exécution en arrière-plan), je crois que le stockage local est effacé, ce qui n'est pas idéal. Existe-t-il un moyen d'empêcher le système d'exploitation ou le navigateur d'effacer automatiquement le stockage local ?

40voto

dvtoever Points 1377

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

Discussion des groupes Google sur le stockage local

Ce blog explique également le problème de manière plus détaillée :

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

Il est possible de faire pointer manuellement votre emplacement de stockage local vers un endroit sûr. Application_Home>/Documents l'emplacement. Pour déterminer votre emplacement actuel de stockage local, 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];
}

2 votes

Oups ! Merci pour l'avertissement, j'étais sur le point de publier sur iOS.

0 votes

Je sais que c'est loin dans le futur. Mais, jetez un coup d'œil à ma réponse ci-dessous en utilisant un plugin de mise en œuvre native : stackoverflow.com/a/39097517/6237235

0 votes

Bonjour, savez-vous comment je peux faire la même chose sur Android ? obtenir le chemin du stockage local ?

6voto

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

Il dispose de fonctions set, put et get qui mettent en œuvre des capacités de plate-forme comme les préférences partagées d'Android et les NSUserDefaults d'iOS, ce qui rend le stockage des 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>);

4voto

aWebDeveloper Points 5546

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

L'utilisateur peut aller dans les paramètres et effacer le cache et les données, auquel cas il s'en va ou si disons une des applications de nettoyage le fait.

Même sur iOS c'est un stockage permanent mais je ne sais pas pour le scénario de mise à jour des applications. Mais dans l'ancienne version (5.1), il ne l'était pas et dans la 6+, ils ont fait en sorte qu'il puisse être rendu permanent grâce à un drapeau qui a été rapidement activé par cordova/phonegap.

0 votes

Pour Android, est-ce que je peux parier ma vie sur le fait que c'est vrai (et que ça le restera) ? Et par "vie", j'entends "données critiques".

3 votes

@Michael je n'utiliserais pas le stockage local pour des données critiques. Faites une recherche sur internet et sur les blogs, beaucoup de choses peuvent mal tourner.

0 votes

Avez-vous une idée de la manière dont je peux accéder au stockage local sur Android à partir d'un code Java ?

4voto

Iceman Points 4257

Une bonne solution, disponible aujourd'hui, est Le plugin de stockage natif Cordova .

Il permet d'utiliser une méthode persistante simple mais native pour sauvegarder des données dans iOS et Android en mettant en œuvre de manière native SharedPreferences dans Android et NSDefault dans iOS pour garantir la fiabilité.

Utilisation :

Installation :

cordova plugin add cordova-plugin-nativestorage

Stockage 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>);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X