5

我正在开发一个 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 -作品


经过测试的解决方案

  • 覆盖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 出现问题。

4

3 回答 3

4

在 ICS (SDK 15) 和 JellyBean (SDK 16) 之间,WebView 的安全模型以及它处理来自 file:// 来源的 javascript 的方式发生了一些变化。请尝试致电

WebSettings.setAllowUniversalAccessFromFileURLs(true)

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

于 2014-02-25T08:57:01.500 回答
2

得知 webstorage api 在 Android 上出现问题,我感到很遗憾,因为我将在接下来的几天内使用它。

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

话虽如此,阅读您的帖子声称 localStorage api 对于 android4.0-4.2 (我也将其作为目标设备)存在问题,我想FileSystem api改用它。

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

但是在网上看,这个api好不好用就很不确定了,最后我找到了这个。

在 Android webview 上使用本地存储

https://github.com/didimoo/AndroidLocalStorage

于 2014-02-24T04:51:49.790 回答
1

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

于 2014-02-20T23:43:08.543 回答