【问题标题】:How permanent is local storage on Android and iOS?Android 和 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 上没有任何信息。

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

【问题讨论】:

    标签: cordova local-storage web-sql


    【解决方案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。
    • 我知道这是通往未来的路。但是,请使用本机实现插件在下面查看我的答案:stackoverflow.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 的包装器!在注释中看到它说“在具有本地存储的浏览器中工作”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-29
        • 2017-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-04
        • 1970-01-01
        相关资源
        最近更新 更多