在我们的android开发中,难免会嵌套一些h5页面在APP中,固然是减轻了开发者的负担,但也容易遇到一些很奇怪的问题。
一、网页图片加载不出来
此前笔者公司由于h5网页链接频繁被劫持篡改(链接被篡改为某大型购物APP的链接过,也被篡改为某新闻APP的链接过),迫不得已,后台紧急替换链接为https。在替换后,发现某些网页上图片加载不出来,最开始以为是网络原因,但试了很多手机后,不得不承认是代码出现了问题。经过各方定位,在浏览器上截取到网页的链接是https,而图片的链接是http,最后发现是webview的安全模式设置问题。
从Android5.0开始,WebView默认不支持同时加载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不允许一个安全的站点(https)去加载非安全的站点内容(http),比如,https网页内容的图片是http链接。强烈建议App使用这种模式,因为这样更安全。
2.MIXED_CONTENT_ALWAYS_ALLOW:在这种模式下,WebView是可以在一个安全的站点(Https)里加载非安全的站点内容(Http),这是WebView最不安全的操作模式,尽可能地不要使用这种模式。
3.MIXED_CONTENT_COMPATIBILITY_MODE:在这种模式下,当涉及到混合式内容时,WebView会尝试去兼容最新Web浏览器的风格。一些不安全的内容(Http)能被加载到一个安全的站点上(Https),而其他类型的内容将会被阻塞。这些内容的类型是被允许加载还是被阻塞可能会随着版本的不同而改变,并没有明确的定义。这种模式主要用于在App里面不能控制内容的渲染,但是又希望在一个安全的环境下运行。
第三种模式极少会用到,因为他是真的不安全了,而第二种方式,在某种意义上来说,他其实还是安全的。后来貌似是遇到了https的网页,加载了http的js文件,导致不得不用到第三种方式(当然,让后台改去吧,咱坚决抵制这种模式)。
二、网页显示不全
有时我们会发现,我们的网页在有些手机上显示不全,表现为有些页面可能太宽,右边顶出去一些,有些宽页面左右滑动有问题,这些其实是因为我们手机默认字体大小影响了,可以试试调整手机默认字体大小(字体太大、太小显示都会有问题)。当然,代码解决方案还是有的。加上下面这句代码:
webview.getSettings().setTextZoom(100);
这句代码的作用是设置WebView里的字体不随系统字体大小设置发生变化。如果这样界面显示的大小还是有问题的话,就得找下h5的同学联调一下了。
三、webview进入某页面退出,h5页面滑不了,点不了等功能异常
这个就比较扭曲了,本来h5页面都好好的,但链接进入了某个第三方的h5页面后,返回发现已加载的h5页面滑动不了,也点击不了,再进入第三方h5页面时,发现第三方的h5功能也出现了各种异常(各手机现象不太一样,但大同小异),这个问题由于项目时间比较紧张,笔者也未曾深究过是为什么。
在手机设置里面有个多进程webview,某些手机开启后就好了,嗯~~~某些手机开启后貌似会更不好。从这个设置可以看出,应该是我们进入第三方h5页面后,在当前进程下,webview的某些参数被修改了,但具体是什么东西被修改呢?不知道。。。
不过呢,不知道为什么不代表咱就改不了bug
从这个修改我们可以看出,只要把webview在不同的进程中加载应该就可以解决这个问题了。在对应的webview的activity配置中加入下面代码
android:process="com.example.web"
让我们的这个webview运行在独立的进程中,在界面销毁时销毁该进程System.exit(0);
经测试,相当完美。据说也可以动态加载webview避免该bug,不过笔者这种懒人,自然是怎么简单怎么来了。
顺便再记录个bug,某些手机从界面点击图标进入APP,必然会从欢迎界面进入(home切换不会),只需要在欢迎界面的onCreate中加入如下代码:
if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) !=0){
finish();
return;
}