工作中的小总结:HTML5 AppCache, 增量升级(任何二进制文件),webview

来源:互联网 发布:sqlite数据库下载 编辑:程序博客网 时间:2024/06/05 19:51


之前我们做过一个应用,所有需要的数据都会在出厂的ROM中预置道SD卡的一个固定位置,这样我们就可以在程序进入后使用了。

利用Android Webview html5的一个特性:AppCache,我用一个前端脚本(phone.js)把要访问的网页自动生成一个ApplicationCache.db,这样我在程序中设置app cache的路径为预置的SD卡路径就可以读到数据了,并且可以利用HTML5的这个特性,实现自动更新数据,非常方便。

但是自从Android4.4发布后,这个机制不能用了,因为4.4开始引入了Chromium内核作为浏览器的核心,原来WebView内核的AppCache的数据存储格式也不像原来WebView只存储在一个ApplicationCache.db中了,分布在了几个文件夹及文件中了,没法用脚本把网页内容自动生成缓存数据了,这个麻烦了。然后我们需要想一个新的方案,需要用户在没有网络的时候也能访问应用数据。那么只能在出厂的时候把数据预置道SD卡中,也可以放到assets中,但是取决于你的数据有多大,我们的数据大约有80M左右,放到assets中就不现实了,所以只能出厂预置道SD中。

我们的应用是一个web应用,里面的内容都是网页,所以我们最新的方案是把整个网站的内容都打包成zip包,预置道SD卡固定的路径,应用第一次启动的时候,找到这个zip,然后解压道固定的路径,这样就可以利用webview 的 loadDataWithBaseURL 方法访问本地数据了,像这样:
file:///storage/emulated/0/data/usercontent/manual_niuqi_cn_sd_chs_1.69/index.htm
只要访问这个路径,就可以访问整个网站了。

但是遇到一个问题,我在访问子页面的时候,返回后,我会手动的执行一段JS代码,这段代码执行了一点操作localstorage的操作,我跟进了一下,确实执行了,但是页面上确实没有反馈出来,我进入道localstorage的数据库中看了看,数据已经写入进去了。还有一个问题,我页面有2个TAB,第二个TAB点击后没有任何相应,理论上应该显示另一个页面的,也是利用JS执行的,但是这段JS也没有执行,好奇怪的说~

然后在访问子页面的时候,我最开始利用的webview.loadUrl的方法加载子页面的URL,但是就有上面的问题,但是在同事的帮助下,改成了loadDataWithBaseURL,就没有上面的问题了,上面的问题暂时没有了,我在进一步测试的过程中发现了一个新的问题,就是在切换语言的时候,还有升级后第一次进入的时候,又发生了上面的问题,但是把应用关闭后再打开就好了(后面介绍下升级的过程)。这个问题暂时还没有解决~



补充:增量升级的过程
升级利用的Google 2012年提出的方法,差分,也就是现在Google play上APK的升级方案,具体原理见:
http://blog.csdn.net/hmg25/article/details/8100896
其实只要是二进制数据就都可以使用这个方案的,不但是APK,也可以是ZIP包,我们的升级方案就是合并2个ZIP包,生成新的包,生成的patch文件非常小,只要几百B,也就是说,连1KB都不到,非常赞的说~



0 0
原创粉丝点击