WebView坑总结(中)

2018-01-30  本文已影响0人  普通的程序员

4.设置webChromeClient的坑

我这里讲几个典型的,

onProgressChanged,用于显示网页加载进度的,不然在加载网页的时候,急躁的用户看不到,呵呵,个辣鸡。

mProgress走到100就代表网页彻底加载完毕,但是限于某些网站的网页写法不是很规整,内容先写出来,但是广告脚本乱插,导致加载很慢,看起来就像

明明网页内容都出来了,但是进度条卡住了。裤子都脱了,洗澡水还没放完。

PS:CrashReport.setJavaScriptMonitor是腾讯bugly监听网页崩溃的api,要求放在这里-----安利一下腾讯的bugly,自动上报崩溃和log,比某些猴子好用多了,而且这种log,猴子抓一辈子都抓不出。

onJSAlert

处理响应网页中的alert弹窗。

承接1中的webview初始化方式,如果按照手动创建,无论如何,这个alert弹窗是看不到的,如果是xml中创建webview,alert弹窗老老实实的弹出。

这里不是setting中allowWindowOpen(名字记不清了,允许自动弹窗)的问题,在控制台中能看到确实响应了这个回调(这里return false是不响应)

所以问题出在view层,alert弹框被覆盖了。不信你们自己试。

后台兄弟每次和我联调必开alert,所以不能因为内存泄漏而顾此失彼。

解决方案就是把 alert的信息用dialog方式展示。

image

网页原生方法横屏播放。

在播放网页视频时,总觉得竖屏播放不爽,想横屏,然后无非

1.打开自动旋转,GG,亲,如果activity不做处理的话,webview会重刷新一次。原因为什么....去搜“横竖屏切换时候Activity的生命周期”;

2.点击网页里的 缩放按钮,结果发现只是从小屏幕变成了全屏里的小屏幕。

并不是真正意义的全屏(横屏播放)

想真正意义的横屏,就得复写onShowCustomView和onHideCustomView

通过两个变量 View mCustomView,CustomViewCallback mCustomViewCallback搞事。

image

那么这里的坑在哪呢?-----这样的横屏,样式,超级无敌阿姆斯特朗回旋加速丑,而且Android4 5 6的样式还各不一样,乃至于这样的横屏在某一部分机型上出现只有声音,画面白屏的问题。

所以很少有做这样的低级横屏。

出现后面白屏的原因,推测大概是网页中有iFrame字段,这个坑我下文也会总结。

那么解决方案,只有治标不治本的,

1.提高minSDK至23;

2.不横屏;

3.出钱让用户买iPhone;

4.换内核---后边也会讲到。

5.设置webviewClient的坑。

稍微搞过一点HTML5的同学就会知道,javaScript很厉害,比如最厉害的那个去百度广告的js.就是当页面加载baidu相关域名时,js把整个页面屏蔽。

是的,我们业务里涉及到要注入js,

坑1:注入js的时机要掌握好,用js去除页面广告,如果放在onLoadResource,可能会出现注入十几次的情况,导致页面闪烁,加flag控制,又怕页面广告资源还没加载,结果被flag怼住了。

坑2:应用允许js注入的话,在上架某些市场的时候会有

因打开addJavaScriptInterface()引起的安全问题.

这个问题主要是因为会有恶意的js代码注入,尤其是在已经获取root权限的手机上,一些恶意程序可能会利用该漏洞安装或者卸载应用.

坑1的解决方法是在 onPageFinished 的时候再注入js

坑2的解决方法是。。。。提高minSDK至4.4

image

但是你以为这样就解决坑1了??太年轻!!!

你见过onPageFinish回调响应两三次的情况么?

为什么?因为网页里有iFrame,iframe就像是另一个次元,一个网页里镶嵌了另一个网页,也就是 父网页并没有finish, 而iframe加载finish,此时响应一次onPageFished,父网页最后再响应一次onPageFinish,这样整个就响应了两次。

所以用onPageFinish来判断网页是否加载完毕,其实是不准确的。

承接上文的onProgressChanged,一样是坑。

所以就出现了一种情况,要在onPageFinish里注入去广告js,而网页的广告资源是在iframe后出现(对,某些视频网站的写法就是这样无敌棒),那无论如何也去不掉广告的。

所以,不要再问什么 为什么xx网页微信打得开,浏览器就打不开。

xx网页里要么有flash,要么有iframe,然后这台机器的web内核是个渣渣。

shouOverriddingUrlLoading回调

由网页处理转向开发者处理。

用在处理 页面里的自定义协议。

坑在,有的协议会让你打开某些应用,而你的机器又没有这些应用,强行用

Intent 处理这种自定义行为,会造成崩溃。

所以这种坑的解决方法

以http和https的就网页处理

其余的return ture,但是啥也不做。

image

那么webviewClient里还有其余类似 receiveError的回调,

这个我就不多说了,多参考Android开发者网站,现在开发者网站谷歌也开了中国版,这里的api处理文档写得很清楚,坑不多。

6.网页内容类型。

这里暂时没遇到坑。

讲一下需求实现。

需求:长按网页里的图片,实现保存图片。

实现,对网页进行监听(手势这块过两天再总结)

网页内容通过 Webview.HitTestResult.getType来判断内容类型。这里我们拿到image类型即可。

比较简单。

image
上一篇下一篇

猜你喜欢

热点阅读