需求
在前端富文本編譯器中徽鼎,插入url笆搓,在Android端 點擊鏈接跳轉(zhuǎn)到新頁面,并加載url纬傲。
分析
要是能拿到 超鏈接的點擊事件(使其不在當(dāng)前WebView中展示),然后跳轉(zhuǎn)新頁面就好了
是可以的=钟印找爱!
介紹
WebViewClient 的 shouldOverrideUrlLoading 维苔,會在點擊加載超鏈接時觸發(fā)。
webViewClient = (object :WebViewClient(){
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
LogUtil.e("url",url)
return super.shouldOverrideUrlLoading(view, url)
}
})
其兩個參數(shù)含義汁雷,一目了然。
重點是返回值报咳!
true 為攔截點擊事件侠讯,表示超鏈接的內(nèi)容不在當(dāng)前 WebView 中加載。(若不做處理暑刃,則點擊超鏈接沒有任何反應(yīng)厢漩,也就是點擊事件被攔截)
false 就是正常的處理事件,點擊超鏈接會在當(dāng)前 WebView 加載超鏈接內(nèi)容
解決
事情已經(jīng)很明白了岩臣,返回值改為 true溜嗜,攔截點擊事件,并通過回調(diào)架谎,處理跳轉(zhuǎn)邏輯炸宵。
webViewClient = (object :WebViewClient(){
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
LogUtil.e("url",url)
callBack?.toRiseClub(url)
return true
}
})
防止DNS劫持,頁面有廣告(2019.2.21)
項目中加載了一個很久以前的系統(tǒng)頁面谷扣,是 http 的
有的用戶反應(yīng)土全,有頁面廣告(運營商劫持)
對比加載的其他H5頁面都沒有被劫持(使用的 https ),定位到問題出在 http 請求
問題來了,頁面地址改為 https 后裹匙,發(fā)現(xiàn)有的資源無法加載(資源地址仍為 http )瑞凑,因為WebView默認(rèn)模式,不允許同時加載 http 與 https 的請求幻件。
可查看《WebView加載https和http混合拨黔,導(dǎo)致圖片不顯示問題》
因為需要同時加載 http 和 https ,所以我選擇了 MIXED_CONTENT_ALWAYS_ALLOW
/**
* 加載RiseClub頁面時绰沥,資源是http的篱蝇,需要允許https與http同時加載,所以放開權(quán)限徽曲。
* 但是要加上白名單功能:手動過濾
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
}
因為要保證安全性零截,所以需要添加 白名單 功能,也就是主角 shouldOverrideUrlLoading
/**
* 攔截所有非 jphonics 和 rtunes 的鏈接
*/
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
url?.let {
/**
* 跳轉(zhuǎn)到 JPHONICS & RTUNES
*/
return !(url.contains(TASK_RISE_CLUB_JPHONICS) || url.contains(TASK_RISE_CLUB_RTUNES))
}
return true
}
true 取消加載秃臣,false 是繼續(xù)加載涧衙,就夠了,詳情如下
慎哉留真我奥此,毋使覆塵埃...