Wie dauerhaft ist der lokale Speicher auf Android und iOS?

75

Wie dauerhaft ist dieser Speicher, wenn meine App Daten lokal auf einem Telefon speichert? Ich werde die genaue Situation erläutern:

Ich baue eine App mit jQueryMobile und Phonegap. Es ist im Wesentlichen eine Browser-App, aber mit Phonegap kann ich sie unter anderem verpacken und in den App Stores verkaufen.

Phonegap bietet zwei Arten der Speicherung, wobei beide Funktionen native Funktionen von iOs, Android, Blackberry und einigen anderen Betriebssystemen harmonisieren: localStorage (primitive Schlüssel-Wert-Paare) und eine Web SQL-Datenbank. Sowohl localStorage als auch Web SQL sind Speicherformen, die zum Browser gehören. Allerdings kann ich nicht herausfinden, wie lange die Daten gespeichert bleiben, unter welchen Umständen sie gelöscht werden, unter welchen Umständen sie möglicherweise nicht verfügbar sind usw.

Wenn die App beispielsweise Daten mit localStorage oder Web SQL speichert und der Benutzer auf seinem Android zu einem anderen Standardbrowser wechselt, wird die App dann mit dem neuen Browser geöffnet. Bedeutet dies, dass die gespeicherten Daten nicht verfügbar sind?

Wenn der Benutzer die App ein Jahr lang nicht verwendet (was in meinem Fall ein realistisches und nicht unbedingt schlechtes Szenario ist), sind die Daten wie ein Cookie abgelaufen oder wurden möglicherweise von einer Flut von aus dem Speicher des Browsers verschoben Daten von anderen Apps?

Oder werden die Daten noch früher zerstört, z. B. wenn: - Benutzer eine andere Site im Browser besuchen - Browser manuell geschlossen wird - Browserprozess abgebrochen wird oder stirbt - usw.

Oder sind localStorage und Web SQL die Art von Speicher, die Sie nur löschen, wenn Sie (in Android) zu Einstellungen> Apps gehen und die mit der App verknüpften Benutzerdaten aktiv entfernen?

Vielen Dank für alle Einblicke. Es gibt nichts Informatives über das alte WWW.

Was passiert beim App-Update? Der lokale Speicher und der Webspeicher werden gelöscht oder bleiben sie erhalten?

Wytze
quelle

Antworten:

58

Lassen Sie mich Schritt für Schritt antworten

Wenn die App Daten mit localStorage oder Web SQL speichert und der Benutzer auf seinem Android zu einem anderen Standardbrowser wechselt, wird die App dann mit dem neuen Browser geöffnet. Bedeutet dies, dass die gespeicherten Daten nicht verfügbar sind?

Die Daten werden im 'Cache' (es ist nicht genau der Cache) des Browsers gespeichert. Wenn Sie also den Browser ändern oder die Einstellungen so einstellen, dass der Standardbrowser entfernt oder geändert wird, werden die Daten gelöscht.

Wenn der Benutzer die App ein Jahr lang nicht verwendet (was in meinem Fall ein realistisches und nicht unbedingt schlechtes Szenario ist), sind die Daten wie ein Cookie abgelaufen oder wurden möglicherweise von einer Flut von aus dem Speicher des Browsers verschoben Daten von anderen Apps?

Nein, die Daten bleiben dort, egal wie lange sie nicht verwendet werden. Selbst wenn Sie den Browser-Cache leeren, bleibt er dort.

Oder werden die Daten noch früher zerstört, z. B. wenn: - Benutzer eine andere Site im Browser besuchen - Browser manuell geschlossen wird - Browserprozess abgebrochen wird oder stirbt - usw.

Nein, die Daten bleiben in Ordnung. :-)

Oder sind localStorage und Web SQL die Art von Speicher, die Sie nur löschen, wenn Sie (in Android) zu Einstellungen> Apps gehen und die mit der App verknüpften Benutzerdaten aktiv entfernen?

Ja, die Daten werden nur gespeichert, wenn Sie sie entweder manuell aus Ihrer App löschen oder Ihre App deinstallieren. Es wird in allen anderen Fällen bleiben.

BEARBEITEN: Bei iOS entfernt das Betriebssystem die Daten im lokalen Speicher, wenn auf dem Gerät nicht genügend Speicher vorhanden ist.

GhostCoder
quelle
Warten Sie, Sie können die Chromeview / Webview nicht in etwas anderes Ihrer Cordova-App ändern, oder?
Daniel Cheung
Diese Frage ist eher theoretisch als praktisch, daher muss ich keinen Code dafür anzeigen. Ich verwende eine PWA-Anwendung in Mobiltelefonen und speichere Daten im lokalen Speicher. So weit, ist es gut. Wenn ich jedoch das Löschen erzwinge (entfernen Sie die Anwendung aus dem Hintergrund), wird der lokale Speicher meiner Meinung nach gelöscht, was nicht ideal ist. Gibt es eine Möglichkeit zu verhindern, dass das Betriebssystem oder der Browser den lokalen Speicher automatisch löschen?
Akshay Kishore
39

Ab iOS 5.1 ist die Antwort von @ ghostCoder nicht mehr gültig. Apple hat beschlossen, den lokalen Speicherort in einen Cache-Ordner zu verschieben, der jederzeit geleert werden kann. Sie können diese Diskussion hier verfolgen:

Google Groups-Diskussion zu Localstorage

Auch dieser Blog erklärt das Problem ausführlicher:

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

Es ist möglich, Ihren lokalen Speicherort manuell auf einen sicheren Application_Home> / Documents- Speicherort zu verweisen . Um Ihren aktuellen lokalen Speicherort zu bestimmen, können Sie Folgendes verwenden:

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

Mit dem folgenden Code können Sie einen anderen Speicherort für Ihren lokalen Speicher festlegen:

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];
} 
dvtoever
quelle
2
Huch! Vielen Dank für die Warnung, ich wollte gerade auf iOS veröffentlichen.
Wytze
Ich weiß, dass es weit in die Zukunft geht. Aber werfen Sie einen Blick auf meine Antwort unten mit einem nativen Implementierungs-Plugin: stackoverflow.com/a/39097517/6237235
Iceman
Hallo, weißt du, wie ich das gleiche auf Android machen kann? den lokalen Speicherpfad bekommen?
Andrei
1
Funktioniert dieser Code noch mit ios11 und die Daten sind sicher?
Mohammad Shraim
6

Probieren Sie das NativeStorage-Plugin aus. https://www.npmjs.com/package/cordova-plugin-nativestorage .

Es hat Funktionen festgelegt, gesetzt und abgerufen, die Plattformfunktionen wie gemeinsame Einstellungen für Android und iOS NSUserDefaults implementieren, wodurch der Datenspeicher so sicher wie möglich wird.

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

quelle
4

Eine gute Lösung, die jetzt verfügbar ist, ist das Cordova Native Storage Plugin .

Es ermöglicht eine einfache, aber native dauerhafte Methode zum Speichern von Daten in iOS und Android, indem SharedPreferences in Android und NSDefault in iOS nativ implementiert werden, um die Zuverlässigkeit zu gewährleisten.

Verwendung:

Installation:

cordova plugin add cordova-plugin-nativestorage

Werte speichern:

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

Werte abrufen:

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

Auf Android ist es standardmäßig ein permanenter Speicher. Auch wenn der Benutzer Ihre App aktualisiert, bleibt sie gleich.

Der Benutzer kann zu den Einstellungen gehen und den Cache und die Daten löschen. In diesem Fall oder wenn beispielsweise eine der Clean-It-Apps dies tut.

Selbst unter iOS ist es permanenter Speicher, aber Sie wissen nichts über das App-Update-Szenario. In der älteren Version (5.1) war dies jedoch nicht der Fall, und in Version 6+ wurde festgelegt, dass es durch eine Flagge dauerhaft gemacht werden kann, die von Cordova / Phonegap umgehend aktiviert wurde.

aWebDeveloper
quelle
Kann ich mein Leben für Android darauf wetten, wahr zu sein (und wahr zu bleiben)? Und mit "Leben" meine ich "kritische Daten".
Michael
3
@ Michael Ich würde keinen lokalen Speicher für kritische Daten verwenden. Wenn Sie im Internet und in Blogs suchen, können viele Dinge schief gehen.
Sarantis Tofas
Haben Sie eine Idee, wie ich über Java-Code auf den lokalen Speicher auf Android zugreifen kann?
Andrei
Nein, kein Java-Entwickler, aber wenn Sie eine Cordova-App ausführen, versuchen Sie, sie von Cordova zu übergeben
aWebDeveloper
1

Ich kann nicht für andere Plattformen sprechen, aber auf meinem 4.1-Android-Gerät verwende ich localStorage, um einige Daten lokal mit jQuery Mobile zu speichern, und ich habe festgestellt, dass Android meinen Cache jede Woche oder so ohne mein Wissen löscht. Ich werde Web SQL ausprobieren und sehen, ob das besser ist.

qJake
quelle
Danke für das Update SpikeX! Ich gehe davon aus, dass Phonegap / Cordova fast genauso schnell eine Lösung finden wird wie für iOS (das war ungefähr ein Monat, glaube ich). Aber das ist nicht jedermanns Sache.
Wytze
@Wytze können Sie die Quelle angeben, die behauptet, dass PhoneGap das Problem unter iOS behoben hat?
Dheeraj Vepakomma
@Dheeraj Nein, sorry, das ist über ein Jahr her. Ich erinnere mich, dass das Problem in einer der folgenden Phonegap-Versionen behoben wurde. Hatte seitdem nie ein Problem damit, weder auf Android noch auf iOS.
Wytze
1

In Bezug auf Leistung, Sicherheit und Zuverlässigkeit wäre es besser, die Verwendung von lokalem Speicher zu vermeiden und Cordova-sqlite-storagestattdessen zu verwenden.

Einige Notizen:

localStoragehat den Vorteil, einfach zu bedienen zu sein, funktioniert aber synchron. Dies bedeutet, dass der UI-Thread gesperrt und eine langsame Leistung verursacht werden kann.

localStorage hat eine begrenzte Menge an Speicher, in der Regel seine 5 MB.

localStoragekann vom Betriebssystem (android, ios) jederzeit gelöscht werden. Dies ist sehr ernst, wenn Sie sich für die Datenbeständigkeit interessieren.

Auf der anderen Seite:

Cordova-sqlite-storage ist asynchron und blockiert den UI-Thread nicht, speichert Ihre Daten auf dem nativen Gerätespeicher, die Speichermenge ist nicht begrenzt, das Betriebssystem löscht keine Ihrer Daten, es sei denn, Sie deinstallieren die App.

Sarantis Tofas
quelle
Ist das Löschen des lokalen Speichers unter iOS11 immer noch ein Problem?
user1261710
0

Ich habe das online gefunden ng-persist

Speichern Sie Daten auf Mobilgeräten (mit Cordova), die auch dann bestehen bleiben, wenn der Benutzer die App neu installiert

Installieren

bower install ng-persist ngstorage --save

Injizieren Sie $persistin Ihren Controller

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

});
niksmac
quelle
Dies ist nur ein Wrapper für LocalStorage! siehe in den Notizen heißt es "funktioniert im Browser mit lokalem Speicher"
Nico Westerdale