Android和iOS上的本地存储有多长时间?


75

当我的应用程序将数据本地存储在手机上时,该存储的永久性如何?我将详细说明这种情况:

我正在使用jQueryMobile和Phonegap构建应用程序。它本质上是一个浏览器应用程序,但是使用Phonegap可以打包并在应用程序商店中出售,还有其他优势。

Phonegap提供了两种存储方式,这两种功能可以协调iO,Android,Blackberry和某些其他OS的本机功能:localStorage(这是原始键值对)和Web SQL数据库。localStorage和Web SQL都是属于浏览器的存储形式。话虽如此,我无法确定数据将被保存多长时间,在什么情况下将被删除,在什么情况下可能将不可用等。

例如,如果该应用程序使用localStorage或Web SQL存储数据,并且用户切换到其Android上的其他标准浏览器,则该应用程序是否将使用新的浏览器打开,这是否意味着存储的数据不可用?

如果用户一年不使用该应用程序(在我看来,这是现实的情况,但不一定是糟糕的情况),数据是否会像cookie一样过期,或者可能由于来自其他应用程序的数据?

还是会更早地销毁数据,例如:-用户访问浏览器中的另一个站点-手动关闭浏览器-浏览器进程被杀死或死亡-等等

还是localStorage和Web SQL是仅在(在Android中)进入“设置”>“应用程序”并主动删除与该应用程序关联的用户数据时才删除的存储类型?

感谢您的任何见解。WWW上没有提供任何信息。

在应用程序更新的情况下会发生什么。本地和Web存储将被删除还是保留?

Answers:


58

让我一步一步地回答

如果该应用程序使用localStorage或Web SQL存储数据,并且用户切换到其Android上的其他标准浏览器,那么该应用程序是否会使用新的浏览器打开,是否表示存储的数据不可用?

数据保存在浏览器的“缓存”中(并非完全是缓存),因此,如果更改浏览器或进行设置,以便删除或更改默认浏览器,则数据将消失。

如果用户一年不使用该应用程序(在我看来,这是现实的情况,但不一定是糟糕的情况),数据是否会像cookie一样过期,或者可能由于来自其他应用程序的数据?

不,无论数据使用多久,它都将保留在那里。因此,即使您清除了浏览器缓存,它仍将存在。

还是会更早地销毁数据,例如:-用户访问浏览器中的另一个站点-手动关闭浏览器-浏览器进程被杀死或死亡-等等

不,数据保持正常。:-)

还是localStorage和Web SQL是仅在(在Android中)进入“设置”>“应用程序”并主动删除与该应用程序关联的用户数据时才删除的存储类型?

是的,仅当您从应用程序中手动将其删除或卸载应用程序时,数据才有效。在所有其他情况下,它将保持不变。

编辑:对于iOS,当设备内存不足时,操作系统将删除本地存储中的数据。


等等,您无法将chromeview / webview更改为cordova应用程序中的其他内容,或者可以吗?
张敬轩

这个问题比理论上更实际,因此我没有任何代码可显示。我在手机中使用PWA应用程序,并且将数据存储在本地存储中。到现在为止还挺好。但是,如果我强制清除(将应用程序从后台运行删除),我相信会清除本地存储,这不是理想的选择。有什么方法可以防止操作系统或浏览器自动清除本地存储?
akshay kishore

39

从iOS 5.1开始,@ ghostCoder的答案不再有效。Apple已决定将本地存储位置移动到可以随时清空的缓存文件夹中。您可以在此处跟踪此讨论:

Google网上论坛关于本地存储的讨论

此外,此博客还更详细地解释了该问题:

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

可以手动将您的本地存储位置指向安全的Application_Home> / Documents位置。要确定您当前的本地存储位置,可以使用以下方法:

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

以下代码允许您为本地存储设置另一个位置:

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
kes!感谢您的警告,我即将发布到iOS。
Wytze 2012年

我知道这是未来的方式。但是,请使用下面的本机实现插件查看我的答案:stackoverflow.com/a/39097517/6237235
Iceman

嗨,您知道我该如何在Android上做同样的事情吗?获取本地存储路径?
andrei

1
这段代码仍可与ios11一起使用,数据是否安全?
Mohammad Shraim '17

6

尝试使用NativeStorage插件。https://www.npmjs.com/package/cordova-plugin-nativestorage

它具有设置,放置和获取功能,这些功能实现了平台功能,例如android共享首选项和iOS NSUserDefaults,这些功能使数据存储在允许的范围内安全。

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

4

Cordova本机存储插件现在是一个很好的解决方案。

通过原生实现Android中的SharedPreferences和iOS中的NSDefault来保证可靠性,它允许一种简单而原生的持久方法在iOS和Android中保存数据。

用法:

安装:

cordova plugin add cordova-plugin-nativestorage

存储值:

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

检索值:

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

4

android上,默认情况下是永久存储。即使用户更新了您的应用,它也保持不变。

用户可以进入设置并清除高速缓存和数据(在这种情况下),或者说有一个清理应用程序可以执行此操作。

即使在iOS上,它也是永久存储,但不了解应用程序更新方案。但是在较旧的版本(5.1)中则不是,在6+中,他们通过可以由cordova / phonegap立即启用的标志将其永久化。


对于Android,这是我可以打赌要成为真实(并保持真实)的东西吗?所谓“生命”,是指“关键数据”。
迈克尔

3
@Michael我不会将本地存储用于关键数据。在互联网和博客上进行搜索,很多事情都会出错。
Sarantis Tofas

您有什么想法可以从Java代码访问Android上的localstorage吗?
andrei

不,不是Java开发人员,但是如果您正在做一个cordova应用,请尝试从cordova传递它
aWebDeveloper

1

我不能说其他平台,但是在我的4.1 Android设备上,我正在使用localStorage通过jQuery Mobile在本地存储一些数据,而且我发现Android每周都会在不知情的情况下清除缓存。我将尝试Web SQL,看看是否更好。


感谢您更新SpikeX!我认为Phonegap / Cordova会提供与iOS一样快的修复程序(我认为大约一个月)。但这不是每个人的选择。
Wytze 2013年

@Wytze您能否提供声称PhoneGap已在iOS上解决此问题的来源?
Dheeraj Vepakomma 2014年

@Dheeraj不,对不起,这是一年多以前。我确实记得该问题已在以下Phonegap版本之一中解决。从那以后,无论是在Android还是iOS上,它都从未遇到过问题。
Wytze 2014年

1

就使用本地存储代替AVOID而言,在性能,安全性和可靠性方面会更好Cordova-sqlite-storage

一些注意事项:

localStorage具有易于使用的优点,但是它以同步方式工作。这意味着它可以锁定UI线程并导致性能降低。

localStorage 存储空间有限,通常为5mb。

localStorage可以随时通过操作系统(android,ios)清除。如果您关心数据持久性,这真的很严重。

另一方面:

Cordova-sqlite-storage 是异步的,它不会阻止UI线程,它将数据保存在本机设备存储中,存储量不受限制,除非卸载应用程序,否则操作系统不会删除您的任何数据。


在iOS11上,清除本地存储是否仍然存在问题?
user1261710

0

我在网上找到了这个 ng-persist

即使用户重新安装应用程序,仍在持久性的移动设备上存储数据(使用cordova)

安装

bower install ng-persist ngstorage --save

注入$persist您的控制器

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

});

这只是LocalStorage的包装!在注释中看到它说“可以在具有本地存储的浏览器中工作”
Nico Westerdale
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.