1. 程式人生 > >Android混合開發,html5自己主動更新爬過的坑

Android混合開發,html5自己主動更新爬過的坑

script loadurl 處理 必須 ack 功能 是個 code ppt

如今使用混合開發的公司越來越多,盡管出現了一些新技術,比方Facebook的react native、阿裏的weex,但依舊阻擋不了一些公司採用h5的決心。當然,這也是從多方面考慮的選擇。

在三年前就使用過html5混合開發,當時做的是一款貴金屬軟件,漲跌五線譜、乾坤交易,還有各個股市的信息,那時候還是上波牛市爆發的前夕,哎。。。

近期公司讓用h5混合開發。一些頁面和功能有h5分擔,最初時候放在本地assets目錄下,後來因為前端同事頻繁改動和更新。再加上數據安全方面考慮,決定把包放在server。採用接口返回字段,推斷是否須要下載更新。接下來就談下開發中遇到的幾個坑。給自己做個筆記,也分享給須要的朋友。

首坑:Android系統

對於h5的混合開發,Android系統就是個大坑,三年前接入h5點時候,那時候好多手機卡的跟ppt似的,4.0後Google進行了一些優化,效率上確實好了非常多。但後面又來了一系列巨坑。比方4.3之前一個內核,4.3一個單獨內核,4.3之後又是一個內核,原生的WebView沒法做到總體兼容,最後採取了一個方案。使用大企鵝的x5內核,長處例如以下:

  1. 裏面類名和方法名,和原生的名稱差點兒是一樣的,使用更方便
  2. QQ和微信都是採用x5內核,內核共享。不須要單獨下載
  3. 兼容性相對較好

二坑:DownloadManager。

最初的方案是採用系統下類DownloadManager,既然是系統提供的,非常多碼友肯定認為非常OK的。可是爆破部隊瞎搞,三星的手機系統卻把DownloadManager的api刪了。這尼瑪就惡心了,你還是繼續玩爆炸吧。。。

三坑:webview載入不顯示

之前放在assets的時候。頁面顯示的非常6,換成下載到本地讀取,竟然不顯示了,打印下路徑,沒問題。那就能夠確定問題出在了載入過程了。查了下資料發現。能夠是用loadData。這樣的方法須要先將html文件讀取出來。以字符串傳入loadData,能夠展示頁面,可是不會引用css、js等文件。也能夠使用loadUrl。只是須要註意,這裏因為是使用本地數據,所以傳入的url須要做些處理,比如:

  1. 假設html文件存於assets:則加前綴:file:///android_asset/
  2. 假設html文件存於sdcard:則加前綴:content://com.android.htmlfileprovider/sdcard/

PS:content前綴可能導致異常,直接使用file:///sdcard/ 或者 file:/sdcard也能夠

四坑:特殊字符的轉義

有一個頁面。iOS同事那邊一直顯示正常,Android這邊怎麽都出不來,相同頁面不同數據的頁面就顯示頁面。當時就認為非常奇怪,不應該是h5點問題。要不iOS也不會顯示,打印了URL一看,擦,URL中有一個”%”,轉義後便OK了。當然,依據須要另一些特殊字符也須要轉義。”%”僅僅是一個個例。

五坑:部分手機報錯不顯示

A WebView method was called on thread ‘JavaBridge’. All WebView methods must be called on the same thread。

這是因為部分手機WebView中方法必須在同一個線程。通過打印Thread.currentThread()便知不屬於同一個線程。解決方式:

mWebView.post(new Runnable() {
                @Override
                public void run() {
                    mWebView.loadUrl("javascript:" + data);
                }
            });

代碼還未從公司項目中剝離,眼下不上傳了,如有錯誤或者補充,多多不吝賜教。

Android混合開發,html5自己主動更新爬過的坑