我正在开发一个 Android 项目,该项目依赖于WebView浏览设备上存储的多个 HTML 页面,并在需要将输入存储到数据库时将输入提交到 Web 视图。
每个页面都包含与 jQuery 绑定到上一页/下一页的控件,每个页面包含不同类型的输入(复选框、文本字段等)。
最后一页包含一个提交按钮,该按钮使用 JSInterface 将结果保存在 SQLite DB 中。
另一个按钮(在自定义顶部导航栏中)提供相同的系统。
可以通过访问包含所有已保存输入的第一页来修改结果,jQuery 系统将填充相应的输入。
有关更多详细信息,我正在使用SDK 19并针对4.4.2,但我曾经与SDK 15并针对4.2.2我没有遇到问题的地方。
如果有人需要查看在简化的系统中做了什么,请检查此JSBin http://jsbin.com/qaxoh/5/edit?html,js,output.
问题
我在用着会话存储为了存储页面之间的输入,我曾经使用 cookie,但是当有超过 150 个键/值对时它们变得不可靠。
我的问题是,在某些设备上,会话存储消失在页面之间。
测试协议
第一种情况 - 仅停留在第一页
如果我只停留在第一页,填写输入然后发送结果,一切都很好。
返回进行修改为我提供了一个完全填满的第一页。
第二种情况 - 在页面之间移动
填充第 1 页后,我转到第 2 页并填充新的输入,然后在页面之间移动以查看每个页面上的输入是否丢失。
一切都已就绪,但如果我发送结果,则仅传输当前页面输入。
Android版本测试结果
-
3.2 - Works
-
4.1.2 - 不起作用
-
4.2.1 - 不起作用
-
4.3 - 不起作用
-
4.4.2 - Works
经过测试的解决方案
Insights
切换自会话存储 to 本地存储没有帮助。
我找到了一些有用的信息 http://jimbergman.net/webkit-version-in-android-version/关于 Android 使用的 WebKit 版本:
安卓3.2.1使用一个相当旧的版本,但它可以工作(v534.13)
Android版本范围从4.0 to 4.3共享相同的WebKit引擎(v534.30)
安卓4.4使用它的全新版本(v537.36),这解释了它的工作原理
虽然不是解决问题的一步,但它可以更准确地了解问题及其影响的设备。
Solution
自 SDK 16 以来,强制采用新的安全设置来阻止 Javascript 代码访问任何来源的内容。
if(Build.VERSION.SDK_INT >= 16) {
setting.setAllowUniversalAccessFromFileURLs(true);
}
感谢ksasq为了找到这个!
[编辑 2014 年 2 月 18 日]
经过一些测试,我将问题指向了 TargetSdkVersion,BuildTarget 没有改变任何东西。
它被设置为15,WebStorage 按预期工作。
如果设置为16或更高,WebStorage 搞砸了。