天天看點

工作中的小總結:HTML5 AppCache, 增量更新(任何二進制檔案),webview

之前我們做過一個應用,所有需要的資料都會在出廠的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都不到,非常贊的說~

繼續閱讀