Android 4.0 – > 4.3(包含) – Webview页面之间的Web存储丢失

我正在开发一个Android项目,该项目依赖于WebView来浏览存储在设备上的多个HTML页面,并在需要将输入存储到数据库中时将其输入webview。

每个页面都包含与jQuery绑定到上一页/下一页的控件,每个页面包含不同类型的输入(复选框,文本字段等)。

最后一页包含一个Submit按钮,它使用JSInterface将结果保存在SQLite DB中。

另一个按钮(在自定义顶部导航栏中)提供相同的系统。

可以通过访问包含所有已保存输入的第一页来修改结果,jQuery系统将填充相应的输入。

有关更多详细信息,我正在使用SDK 19并针对4.4.2进行编译,但我曾经使用SDK 15并针对4.2.2进行编译,我没有遇到此问题。

如果有人需要查看已完成的操作,请在简化的系统中查看此JSBin 。


问题

我正在使用SessionStorage存储页面之间的输入,我曾经使用过cookie但是当有超过150个键/值对时它们变得不可靠。

我的问题是在某些设备上, SessionStorage在页面之间消失。


测试协议

第一种情况 – 仅保留在第一页

如果我只留在第一页,填写输入然后发送结果,一切都很好。 回来修改为我提供了一个完整的第一页。

第二种情况 – 在页面之间移动

填写第1页后,我转到第2页并填充新输入,然后在页面之间移动,以查看每个页面上的输入是否丢失。 一切都到位,但如果我发送结果,则只传输当前页面输入。


Android版测试结果

  • 3.2 – 工程

  • 4.1.2 – 不起作用

  • 4.2.1 – 不起作用

  • 4.3 – 不起作用

  • 4.4.2 – 工程


测试解决方案

  • 覆盖WebViewClientshouldOverrideUrlLoading方法以返回False – 不起作用

  • 使用LocalStorage而不是SessionStorage并没有改变一件事

洞察

sessionStorage切换到localStorage没有帮助。

我找到了一些有关Android使用的WebKit版本的有用信息 :

Android 3.2.1使用相当旧的版本,但它的工作原理(v534.13)

4.04.3的 Android版本共享相同的WebKit引擎(v534.30)

Android 4.4使用了它的全新版本(v537.36),这解释了它的工作原理

没有一个步骤可以解决问题,但它可以更准确地查看问题及其影响的设备。

自SDK 16起,新的安全设置被迫阻止Javascript代码访问来自任何来源的内容。

if(Build.VERSION.SDK_INT >= 16) { setting.setAllowUniversalAccessFromFileURLs(true); } 

感谢ksasq找到这个!

[编辑18/02/2014]

经过一些测试,我将问题指向TargetSdkVersion,BuildTarget不会改变任何东西。

它设置为15 ,WebStorage按预期工作。

如果它设置为16或更高,WebStorage就会搞乱。

在ICS(SDK 15)和JellyBean(SDK 16)之间,WebView的安全模型有一些变化,以及它如何处理来自file:// origin的javascript。 请尝试打电话

 WebSettings.setAllowUniversalAccessFromFileURLs(true) 

确认您正在使用file:// URL并信任您正在显示的内容。 我想,由于在4.4中升级到Chromium WebView,底层实现中的其他更改不需要这些设置。

我很遗憾听到webstorage api在Android上存在问题,因为我将在未来几天内使用它。

正如您已经调查过的那样,Android 4.4使用了一个基于ChromeBrowser的全新WebView,其中很多网络技术如webScoket等除了localStorage api已经得到了很好的支持。

话虽如此,阅读你的post声称localStorage api有一个问题android4.0-4.2(我也瞄准目标设备),我认为使用FileSystem api

http://www.html5rocks.com/en/tutorials/file/filesystem/

然而,看着网络,这个api是否运作良好是如此不确定,最后我发现了这一点。

在Android webview上使用本地存储

https://github.com/didimoo/AndroidLocalStorage

我的理解是会话存储存在,而创建它的窗口仍然打开,本地存储在会话之间是持久的。 那么浏览器会在两个本地文件之间导航时将窗口保持打开状态吗? 这可以解释。 查看代码,将其更改为使用本地存储而不是会话存储似乎相当容易,那么这是一个选项吗?