在我們的android開發(fā)中,難免會嵌套一些h5頁面在APP中,固然是減輕了開發(fā)者的負(fù)擔(dān),但也容易遇到一些很奇怪的問題。
一、網(wǎng)頁圖片加載不出來
此前筆者公司由于h5網(wǎng)頁鏈接頻繁被劫持篡改(鏈接被篡改為某大型購物APP的鏈接過,也被篡改為某新聞APP的鏈接過),迫不得已,后臺緊急替換鏈接為https。在替換后,發(fā)現(xiàn)某些網(wǎng)頁上圖片加載不出來,最開始以為是網(wǎng)絡(luò)原因,但試了很多手機(jī)后,不得不承認(rèn)是代碼出現(xiàn)了問題。經(jīng)過各方定位,在瀏覽器上截取到網(wǎng)頁的鏈接是https,而圖片的鏈接是http,最后發(fā)現(xiàn)是webview的安全模式設(shè)置問題。
從Android5.0開始,WebView默認(rèn)不支持同時加載Https和Http混合模式。加上下面這句代碼就好了:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
webSetting.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
}
webview有以下幾種模式:
1.MIXED_CONTENT_NEVER_ALLOW:Webview不允許一個安全的站點(diǎn)(https)去加載非安全的站點(diǎn)內(nèi)容(http),比如,https網(wǎng)頁內(nèi)容的圖片是http鏈接。強(qiáng)烈建議App使用這種模式,因?yàn)檫@樣更安全。
2.MIXED_CONTENT_ALWAYS_ALLOW:在這種模式下,WebView是可以在一個安全的站點(diǎn)(Https)里加載非安全的站點(diǎn)內(nèi)容(Http),這是WebView最不安全的操作模式,盡可能地不要使用這種模式。
3.MIXED_CONTENT_COMPATIBILITY_MODE:在這種模式下,當(dāng)涉及到混合式內(nèi)容時,WebView會嘗試去兼容最新Web瀏覽器的風(fēng)格。一些不安全的內(nèi)容(Http)能被加載到一個安全的站點(diǎn)上(Https),而其他類型的內(nèi)容將會被阻塞。這些內(nèi)容的類型是被允許加載還是被阻塞可能會隨著版本的不同而改變,并沒有明確的定義。這種模式主要用于在App里面不能控制內(nèi)容的渲染,但是又希望在一個安全的環(huán)境下運(yùn)行。
第三種模式極少會用到,因?yàn)樗钦娴牟话踩耍诙N方式,在某種意義上來說,他其實(shí)還是安全的。后來貌似是遇到了https的網(wǎng)頁,加載了http的js文件,導(dǎo)致不得不用到第三種方式(當(dāng)然,讓后臺改去吧,咱堅(jiān)決抵制這種模式)。
二、網(wǎng)頁顯示不全
有時我們會發(fā)現(xiàn),我們的網(wǎng)頁在有些手機(jī)上顯示不全,表現(xiàn)為有些頁面可能太寬,右邊頂出去一些,有些寬頁面左右滑動有問題,這些其實(shí)是因?yàn)槲覀兪謾C(jī)默認(rèn)字體大小影響了,可以試試調(diào)整手機(jī)默認(rèn)字體大小(字體太大、太小顯示都會有問題)。當(dāng)然,代碼解決方案還是有的。加上下面這句代碼:
webview.getSettings().setTextZoom(100);
這句代碼的作用是設(shè)置WebView里的字體不隨系統(tǒng)字體大小設(shè)置發(fā)生變化。如果這樣界面顯示的大小還是有問題的話,就得找下h5的同學(xué)聯(lián)調(diào)一下了。
三、webview進(jìn)入某頁面退出,h5頁面滑不了,點(diǎn)不了等功能異常
這個就比較扭曲了,本來h5頁面都好好的,但鏈接進(jìn)入了某個第三方的h5頁面后,返回發(fā)現(xiàn)已加載的h5頁面滑動不了,也點(diǎn)擊不了,再進(jìn)入第三方h5頁面時,發(fā)現(xiàn)第三方的h5功能也出現(xiàn)了各種異常(各手機(jī)現(xiàn)象不太一樣,但大同小異),這個問題由于項(xiàng)目時間比較緊張,筆者也未曾深究過是為什么。
在手機(jī)設(shè)置里面有個多進(jìn)程webview,某些手機(jī)開啟后就好了,嗯~~~某些手機(jī)開啟后貌似會更不好。從這個設(shè)置可以看出,應(yīng)該是我們進(jìn)入第三方h5頁面后,在當(dāng)前進(jìn)程下,webview的某些參數(shù)被修改了,但具體是什么東西被修改呢?不知道。。。
不過呢,不知道為什么不代表咱就改不了bug
從這個修改我們可以看出,只要把webview在不同的進(jìn)程中加載應(yīng)該就可以解決這個問題了。在對應(yīng)的webview的activity配置中加入下面代碼
android:process="com.example.web"
讓我們的這個webview運(yùn)行在獨(dú)立的進(jìn)程中,在界面銷毀時銷毀該進(jìn)程System.exit(0);
經(jīng)測試,相當(dāng)完美。據(jù)說也可以動態(tài)加載webview避免該bug,不過筆者這種懶人,自然是怎么簡單怎么來了。
順便再記錄個bug,某些手機(jī)從界面點(diǎn)擊圖標(biāo)進(jìn)入APP,必然會從歡迎界面進(jìn)入(home切換不會),只需要在歡迎界面的onCreate中加入如下代碼:
if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) !=0){
finish();
return;
}