最近遇到一些webview的问题,为了让以后少走弯路,今天做个记录。问题主要的原因是由于android系统版本问题导致的,webview在android4.4以后做了许多修改,这样会随着android版本的升级会导致webview在版本兼容方面出现一些问题,比如android4.4以前(包含)webview对http跟https协议的安全认证方式是不区分的,但是在4.4版本以后google就对安全认证方式进行了严格的区分,但并不是说完全摒弃不安全的https认证方式,版本是向下兼容的。
一、android4.4以后google对http与https的安全认证方式进行了严格的区分,WebView默认不支持同时加载Https和Http混合模式。
在android4.4以前比如在webview里面播放视频是没有问题,比如优酷,腾讯视频都是正常播放,但是某天测试跟你反应腾讯视频不能播放了,然后你就懵逼了,明明之前是一直正常的为什么现在不行了,而且还是某些视频不能播放,这才是最骚的。作为一个有经验的程序猿应该第一反应到是android版本的兼容问题,没错这是google在4.4版本以后对http与https进行了安全认证的区分,4.4以后默认不支持https这种方式,但是google是提供向下兼容的所以提供了三种模式来适应不同的场景:
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里面不能控制内容的渲染,但是又希望在一个安全的环境下运行。
所以我们只需要在代码里面添加一行代码就好,记得要判断版本:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); }
备注:使用MIXED_CONTENT_COMPATIBILITY_MODE也是可以的,但是官方所说的这种场景没有测试过,定义不明确所以保险起见用MIXED_CONTENT_ALWAYS_ALLOW
二、android4.4以后webview默认不保存cookie状态
很多时候我们会在webview上进行第三方登录之类的需求,比如qq,微博之类的,但是在4.4以后
你会发现qq或者微博登录会在qq上显示授权登录成功但是webview上面却显示未登录状态,会存在一直登录不
上的现象,但是在4.4以前是正常的,这个也是因为android4.4以后google为了安全性的要求默认不保存cookie状态,
google也提供了API可以设置在4.4以后进行cookie保存,代码设置如下:记得判断版本
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ //android5.0以后webview默认不在保存cookie所以会导致第三方登录状态无法保存 CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptThirdPartyCookies(webView,true); }以上就是我最近遇到关于webview版本上兼容的问,如果有误请纠正,日常问题记录。