WebView 应用程序(PhoneGap Build),重启后不保存 localStorage

Posted

技术标签:

【中文标题】WebView 应用程序(PhoneGap Build),重启后不保存 localStorage【英文标题】:WebView app (PhoneGap Build), not saving localStorage after restart 【发布时间】:2016-03-24 09:39:16 【问题描述】:

由于某种原因,当我重新启动 PhoneGap 应用时 - 它会丢失之前存储的 localStorage 值!我以正常方式保存它们:

localStorage.setItem("foo","value");

这可以很好地存储它。但是,当您重新启动应用程序(或随机关闭设备一段时间)时,似乎会随机丢失数据。我发现了很多关于这个的帖子 - 但没有关于如何让它在 PhoneGap Build WebView 应用程序中持久存在的明确答案,

欢迎提出任何建议!

这似乎是 WebView 应用程序的常见问题:

android 2.3.6 + Phonegap + localStorage Android - Making Webview DomStorage persistant after app closed

我找不到适用于 PhoneGap Build 应用的解决方案

我正在使用的一个实际示例是:

    var current_id = parseInt(currentId) + 1;
    localStorage.setItem("entry_"+current_id,save_string);
    localStorage.setItem("entryId",current_id);

..然后提取它(这并不重要,因为问题在于数据丢失,而不是访问它)

                for (var i = 0; i < localStorage.length; i++)
                    if (localStorage.key(i).match("entry_")) 
                        outputString += "\n" + localStorage.getItem(localStorage.key(i));
                    
                

我想知道从 PhoneGap Build cli-5.2.0 升级到 cli-6.0.0 是否会有所帮助。我会这样做,然后试一试。

我想另一种选择是使用 SQL 数据库在本地存储设备(设置起来有点棘手,并且意味着重写我的代码)

更新: 不是理想的解决方案 - 但我现在已将应用程序转移到应用程序中使用 WebSQL。掌握窍门有点棘手(以前从未使用过) - 但似乎可以完成这项工作,并且不应该丢失数据:)

【问题讨论】:

更新到 cli-6.0.0 应该可以解决您的问题,因为它已在 cordova-android 5.1.1 上得到修复,这是 cli-6.0.0 中包含的版本issues.apache.org/jira/browse/CB-10157 @jcesarmobile - 感谢您的更新。我最终不得不将整个应用程序转换为使用 WebSQL,因为 localStorage 太不可靠了 :( 很高兴知道它现在应该修复了 WebSQL 没有被删除?错误是应用程序被卸载并重新安装,这也应该删除 WebSQL。 @jcesarmobile - 嗯,好吧,也许那不是同一个错误 :) 这不是卸载/重新安装的问题......但只是重新启动应用程序(关闭设备,让它关闭一会儿,然后重新启动) @jcesarmobile - 它使用的是最新版本 (6.0.1)。谢谢! 【参考方案1】:

编辑

我这样试了,效果不错:

    var current_id = parseInt(currentId) + 1;
    localStorage.setItem("entry_"+current_id,save_string);
    localStorage.setItem("entryId",current_id);
/*
    //this is for checking, what is stored in localStorage
    console.log("length: " + localStorage.length);
    for(var i = 0; i < localStorage.length; i++) 
        console.log(localStorage.key(i));
    
*/

    var myEntryIdFromStorage = localStorage.getItem("entryId");
    var myItem = localStorage.getItem("entry_" + myEntryIdFromStorage);


澄清的旧答案

如何获取本地存储?

通常你应该像以前一样存储物品:

var permanentStorage = window.localstorage;

permanentStorage.setItem("foo", "bar");

并通过以相同方式初始化永久存储来取回它们,并且:

//assuming you have permanentStorage in the same script file
//or else you have to initialize it again:
//var permanentStorage = window.localstorage;

var myItem = permanentStorage.getItem("foo");
console.log("myItem: " + myItem);

方法存储项使用两个参数:标识符和数据本身。请检查您存储数据所用的标识符是否与您取回数据时所用的标识符相同。

你有任何错误吗?返回(存储在我的示例中的 myItem 中)是 null 还是 undefined 还是只是一个空字符串?这在浏览器或设备上会失败吗?

您可以通过提供更多代码或错误消息来澄清您的问题!

【讨论】:

我只是以localStorage.setItem("entry_"+current_id,save_string); 的身份进行操作,然后使用localStorage.getItem("x") 将其取回......但这就是没有正确保存的内容:((它会保存它以开始,但是如果您将设备关闭一段时间,然后重新打开,则数据已消失) 我找到了这篇旧帖子,但我不确定如何使用 PhoneGap 构建过程(即在 JS 中)来完成:***.com/questions/4157184/… 您能否编辑您的问题并提供更多代码。否则很难帮你! -没问题。我已经更新了 OP 以包含更多内容。正如我所说,它的标准代码非常糟糕......这就是为什么我对它丢失的原因感到困惑 我已将问题更新为在该区域更加明确:但是,当您重新启动应用程序(或随机关闭设备一段时间)

以上是关于WebView 应用程序(PhoneGap Build),重启后不保存 localStorage的主要内容,如果未能解决你的问题,请参考以下文章

使用 phonegap 防止键盘在 iOS 应用程序中向上推 webview

iOS 9.2.1 获取 webView:didFailLoadWithError - 102:Phonegap 中的帧加载中断

如何在iOS中phonegap插件的点击事件上调整cordova Webview的大小

Android——PhoneGap/WebView 忽略视口元标记?

PhoneGap 键盘没有向上推 webview

在 Android 2.0+ 上的 WebView 中使用 navigator.geolocation.getCurrentPosition(PhoneGap 相关)