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 – 工程
测试解决方案
-
覆盖WebViewClient的shouldOverrideUrlLoading方法以返回False – 不起作用
-
使用LocalStorage而不是SessionStorage并没有改变一件事
洞察
从sessionStorage切换到localStorage没有帮助。
我找到了一些有关Android使用的WebKit版本的有用信息 :
Android 3.2.1使用相当旧的版本,但它的工作原理(v534.13)
从4.0到4.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上使用本地存储
我的理解是会话存储存在,而创建它的窗口仍然打开,本地存储在会话之间是持久的。 那么浏览器会在两个本地文件之间导航时将窗口保持打开状态吗? 这可以解释。 查看代码,将其更改为使用本地存储而不是会话存储似乎相当容易,那么这是一个选项吗?