需求
在前端富文本编译器中,插入url,在Android端 点击链接跳转到新页面,并加载url。
分析
要是能拿到 超链接的点击事件(使其不在当前WebView中展示),然后跳转新页面就好了
是可以的!!
介绍
WebViewClient 的 shouldOverrideUrlLoading ,会在点击加载超链接时触发。
webViewClient = (object :WebViewClient(){
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
LogUtil.e("url",url)
return super.shouldOverrideUrlLoading(view, url)
}
})
其两个参数含义,一目了然。
重点是返回值!
true 为拦截点击事件,表示超链接的内容不在当前 WebView 中加载。(若不做处理,则点击超链接没有任何反应,也就是点击事件被拦截)
false 就是正常的处理事件,点击超链接会在当前 WebView 加载超链接内容
解决
事情已经很明白了,返回值改为 true,拦截点击事件,并通过回调,处理跳转逻辑。
webViewClient = (object :WebViewClient(){
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
LogUtil.e("url",url)
callBack?.toRiseClub(url)
return true
}
})
防止DNS劫持,页面有广告(2019.2.21)
项目中加载了一个很久以前的系统页面,是 http 的
有的用户反应,有页面广告(运营商劫持)
对比加载的其他H5页面都没有被劫持(使用的 https ),定位到问题出在 http 请求
问题来了,页面地址改为 https 后,发现有的资源无法加载(资源地址仍为 http ),因为WebView默认模式,不允许同时加载 http 与 https 的请求。
可查看《WebView加载https和http混合,导致图片不显示问题》
因为需要同时加载 http 和 https ,所以我选择了 MIXED_CONTENT_ALWAYS_ALLOW
/**
* 加载RiseClub页面时,资源是http的,需要允许https与http同时加载,所以放开权限。
* 但是要加上白名单功能:手动过滤
*/
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 {
/**
* 跳转到 JPHONICS & RTUNES
*/
return !(url.contains(TASK_RISE_CLUB_JPHONICS) || url.contains(TASK_RISE_CLUB_RTUNES))
}
return true
}
true 取消加载,false 是继续加载,就够了,详情如下
慎哉留真我,毋使覆尘埃...