在我們的android開發(fā)中,難免會(huì)嵌套一些h5頁面在APP中府瞄,固然是減輕了開發(fā)者的負(fù)擔(dān)碧磅,但也容易遇到一些很奇怪的問題。
一遵馆、網(wǎng)頁圖片加載不出來
此前筆者公司由于h5網(wǎng)頁鏈接頻繁被劫持篡改(鏈接被篡改為某大型購(gòu)物APP的鏈接過鲸郊,也被篡改為某新聞APP的鏈接過),迫不得已货邓,后臺(tái)緊急替換鏈接為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)不支持同時(shí)加載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不允許一個(gè)安全的站點(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是可以在一個(gè)安全的站點(diǎn)(Https)里加載非安全的站點(diǎn)內(nèi)容(Http),這是WebView最不安全的操作模式嗓蘑,盡可能地不要使用這種模式峻汉。
3.MIXED_CONTENT_COMPATIBILITY_MODE:在這種模式下,當(dāng)涉及到混合式內(nèi)容時(shí)脐往,WebView會(huì)嘗試去兼容最新Web瀏覽器的風(fēng)格休吠。一些不安全的內(nèi)容(Http)能被加載到一個(gè)安全的站點(diǎn)上(Https),而其他類型的內(nèi)容將會(huì)被阻塞业簿。這些內(nèi)容的類型是被允許加載還是被阻塞可能會(huì)隨著版本的不同而改變瘤礁,并沒有明確的定義。這種模式主要用于在App里面不能控制內(nèi)容的渲染梅尤,但是又希望在一個(gè)安全的環(huán)境下運(yùn)行柜思。
第三種模式極少會(huì)用到岩调,因?yàn)樗钦娴牟话踩耍诙N方式赡盘,在某種意義上來說号枕,他其實(shí)還是安全的。后來貌似是遇到了https的網(wǎng)頁陨享,加載了http的js文件葱淳,導(dǎo)致不得不用到第三種方式(當(dāng)然,讓后臺(tái)改去吧抛姑,咱堅(jiān)決抵制這種模式)赞厕。
二、網(wǎng)頁顯示不全
有時(shí)我們會(huì)發(fā)現(xiàn)定硝,我們的網(wǎng)頁在有些手機(jī)上顯示不全皿桑,表現(xiàn)為有些頁面可能太寬,右邊頂出去一些蔬啡,有些寬頁面左右滑動(dòng)有問題诲侮,這些其實(shí)是因?yàn)槲覀兪謾C(jī)默認(rèn)字體大小影響了,可以試試調(diào)整手機(jī)默認(rèn)字體大邢潴 (字體太大浆西、太小顯示都會(huì)有問題)。當(dāng)然顽腾,代碼解決方案還是有的近零。加上下面這句代碼:
webview.getSettings().setTextZoom(100);
這句代碼的作用是設(shè)置WebView里的字體不隨系統(tǒng)字體大小設(shè)置發(fā)生變化。如果這樣界面顯示的大小還是有問題的話抄肖,就得找下h5的同學(xué)聯(lián)調(diào)一下了久信。
三、webview進(jìn)入某頁面退出漓摩,h5頁面滑不了裙士,點(diǎn)不了等功能異常
這個(gè)就比較扭曲了,本來h5頁面都好好的管毙,但鏈接進(jìn)入了某個(gè)第三方的h5頁面后腿椎,返回發(fā)現(xiàn)已加載的h5頁面滑動(dòng)不了,也點(diǎn)擊不了夭咬,再進(jìn)入第三方h5頁面時(shí)啃炸,發(fā)現(xiàn)第三方的h5功能也出現(xiàn)了各種異常(各手機(jī)現(xiàn)象不太一樣,但大同小異)卓舵,這個(gè)問題由于項(xiàng)目時(shí)間比較緊張南用,筆者也未曾深究過是為什么。
在手機(jī)設(shè)置里面有個(gè)多進(jìn)程webview,某些手機(jī)開啟后就好了裹虫,嗯~~~某些手機(jī)開啟后貌似會(huì)更不好肿嘲。從這個(gè)設(shè)置可以看出,應(yīng)該是我們進(jìn)入第三方h5頁面后筑公,在當(dāng)前進(jìn)程下雳窟,webview的某些參數(shù)被修改了,但具體是什么東西被修改呢匣屡?不知道封救。。耸采。
不過呢兴泥,不知道為什么不代表咱就改不了bug
從這個(gè)修改我們可以看出工育,只要把webview在不同的進(jìn)程中加載應(yīng)該就可以解決這個(gè)問題了虾宇。在對(duì)應(yīng)的webview的activity配置中加入下面代碼
android:process="com.example.web"
讓我們的這個(gè)webview運(yùn)行在獨(dú)立的進(jìn)程中,在界面銷毀時(shí)銷毀該進(jìn)程System.exit(0);
經(jīng)測(cè)試如绸,相當(dāng)完美嘱朽。據(jù)說也可以動(dòng)態(tài)加載webview避免該bug,不過筆者這種懶人怔接,自然是怎么簡(jiǎn)單怎么來了搪泳。
順便再記錄個(gè)bug,某些手機(jī)從界面點(diǎn)擊圖標(biāo)進(jìn)入APP扼脐,必然會(huì)從歡迎界面進(jìn)入(home切換不會(huì))岸军,只需要在歡迎界面的onCreate中加入如下代碼:
if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) !=0){
finish();
return;
}