Android 和 iOS 上的本地存储有多持久?
Posted
技术标签:
【中文标题】Android 和 iOS 上的本地存储有多持久?【英文标题】:How permanent is local storage on Android and iOS? 【发布时间】:2011-12-06 17:49:39 【问题描述】:当我的应用在手机上本地存储数据时,该存储的持久性如何?我会详细说明具体情况:
我正在使用 jQueryMobile 和 Phonegap 构建一个应用程序。它本质上是一个浏览器应用,但使用 Phonegap 可以让我将其打包并在应用商店中销售,还有其他优势。
Phonegap 提供两种存储方式,这两种功能都协调了 iO、android、Blackberry 和其他一些操作系统的原生功能:localStorage(原始键值对)和 Web SQL 数据库。 localStorage 和 web SQL 都是属于浏览器的存储形式。话虽如此,我不知道数据会保存多长时间,在什么情况下会被删除,在什么情况下可能不可用等等。
例如,如果应用使用 localStorage 或 web SQL 存储数据,并且用户在其 Android 上切换到不同的标准浏览器,是否会使用新浏览器打开应用,这是否意味着存储的数据不可用?
如果用户一年不使用应用程序(在我的情况下这是一个现实的情况,不一定是坏情况),数据是否会像 cookie 一样过期,或者可能被从浏览器的存储中推出来自其他应用的海量数据?
或者数据是否会更早被销毁,例如: - 用户在浏览器中访问另一个站点 - 浏览器被手动关闭 - 浏览器进程被杀死或死亡 - 等等
或者 localStorage 和 web SQL 是您仅在(在 Android 中)转到“设置”>“应用程序”并主动删除与该应用程序关联的用户数据时才删除的存储类型?
感谢您的任何见解。在 ol' WWW 上没有任何信息。
在应用更新的情况下会发生什么。本地和网络存储将被删除还是会保留?
【问题讨论】:
【参考方案1】:让我一步一步回答
如果应用使用 localStorage 或 Web SQL 存储数据,并且用户 在他们的 Android 上切换到不同的标准浏览器, 使用新浏览器打开应用程序,这是否意味着存储的 数据不可用?
数据保存在浏览器的“缓存”(不完全是缓存)中,因此如果您更改浏览器,或设置设置为删除或更改默认浏览器,数据将消失。
如果用户一年不使用该应用程序(在我的情况下是 现实的,不一定是坏情况),数据是否有 像 cookie 一样过期,或者可能被推出浏览器的 来自其他应用的大量数据存储?
不,无论多长时间不使用,数据都会保留在那里。所以即使你清除了浏览器缓存,它仍然会在那里。
或者数据是否会更早地被销毁,例如: - 用户 在浏览器中访问另一个站点 - 手动关闭浏览器 - 浏览器进程被杀死或死亡 - 等等
不,数据没有问题。 :-)
或者是 localStorage 和 web SQL 是你唯一的存储类型 当您(在 Android 中)转到“设置”>“应用程序”并主动删除时删除 与应用关联的用户数据?
是的,只有当您从应用中手动删除数据或卸载应用时,数据才会保留。它将在所有其他情况下保持不变。
编辑: 对于 ios,当设备内存不足时,操作系统会删除本地存储中的数据。
【讨论】:
等等,您不能将 chromeview/webview 更改为您的 cordova 应用程序的其他内容,或者可以吗? 这个问题比实际问题更理论化,因此我没有任何代码可以显示。我在手机中使用 PWA 应用程序,并将数据存储在本地存储中。到目前为止,一切都很好。但是如果我强制清除(从后台运行的应用程序中删除),我相信本地存储会被清除,这并不理想。有什么办法可以防止操作系统或浏览器自动清空本地存储?【参考方案2】:从 iOS 5.1 开始,@ghostCoder 的回答不再有效。 Apple 已决定将本地存储位置移动到可以随时清空的缓存文件夹中。您可以在此处跟踪此讨论:
Google Groups Discussion on Localstorage
此博客也更详细地解释了该问题:
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];
【讨论】:
哎呀!感谢您的警告,我正要发布到 iOS。 我知道这是通往未来的路。但是,请使用本机实现插件在下面查看我的答案:***.com/a/39097517/6237235 嗨,你知道我如何在 Android 上做同样的事情吗?获取本地存储路径? 这段代码在 ios11 上是否仍然有效,数据是否安全?【参考方案3】:试试 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】:现在可用的一个很好的解决方案是The Cordova Native Storage Plugin。
通过在 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>);
【讨论】:
【参考方案5】:在 android 上,默认情况下它是永久存储。即使用户更新了您的应用,它也保持不变。
用户可以转到设置并清除缓存和数据,在这种情况下它会运行,或者如果说其中一个 clean-it 应用程序会这样做。
即使在 iOS 上,它也是永久存储,但不了解应用更新方案。但是在旧版本(5.1)中它不是,并且在 6+ 中,他们使它可以通过由 cordova/phonegap 迅速启用的标志使其永久化。
【讨论】:
对于 Android,这是我可以赌上我的生命在真实(并保持真实)的事情吗?我所说的“生命”是指“关键数据”。 @Michael 我不会将本地存储用于关键数据。在互联网和博客上搜索,很多事情都会出错。 你有什么想法我可以通过 java 代码访问 Android 上的本地存储吗? 不,不是 java 开发者,但如果你正在做一个 cordova 应用程序,请尝试从 cordova 传递它【参考方案6】:我不能代表其他平台,但在我的 4.1 Android 设备上,我使用 localStorage 通过 jQuery Mobile 在本地存储一些数据,我发现 Android 每周左右都会清除我的缓存而无需我的知识。我将尝试使用 Web SQL,看看是否更好。
【讨论】:
感谢 SpikeX 的更新!我认为 Phonegap/Cordova 会像他们为 iOS 所做的一样快地提出一个修复程序(我认为那是大约一个月)。但这不是每个人的选择。 @Wytze 您能否提供声称 PhoneGap 已在 iOS 上解决问题的来源? @Dheeraj 不,抱歉,这是一年多以前的事了。我确实记得该问题已在以下 Phonegap 版本之一中得到解决。从那以后,无论是在 Android 还是 iOS 上,它都没有遇到过问题。【参考方案7】:避免使用本地存储并改用Cordova-sqlite-storage
,在性能、安全性和可靠性方面会更好。
一些注意事项:
localStorage
具有易于使用的优点,但它以同步方式工作。这意味着它可以锁定 UI 线程并导致性能下降。
localStorage
的存储空间有限,通常为 5mb。
localStorage
可以随时被操作系统 (android,ios) 清除。如果您关心数据持久性,这真的很严重。
另一方面:
Cordova-sqlite-storage
是异步的,它不会阻塞UI线程,它将你的数据保存在本机设备存储中,存储量不受限制,操作系统不会删除你的任何数据,除非你卸载应用程序.
【讨论】:
本地存储被清除在iOS11上仍然是一个问题吗?【参考方案8】:我在网上找到了这个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 的包装器!在注释中看到它说“在具有本地存储的浏览器中工作”以上是关于Android 和 iOS 上的本地存储有多持久?的主要内容,如果未能解决你的问题,请参考以下文章
Android - 应用更新后 WebView html5 本地存储不持久
iOS/Android 上 HTML5 混合应用中持久存储的可靠方法
iOS 8,9 上的 NSUserDefaults 有多安全?