我正在开发一个 Android 项目,该项目依赖于WebView来浏览存储在设备上的多个 HTML 页面,并在需要将输入存储在数据库中时将输入提交给 webview。
每个页面包含与 jQuery 绑定到上一页/下一页的控件,每个页面包含不同类型的输入(复选框、文本字段等)。
最后一页包含一个提交按钮,该按钮使用 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 出现问题。