1、Android 5.0 WebView中Http和Https混合内容
1.1 在Android5.0 中WebView默认不允许加载Http、Https混合内容,解决办法如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); }
MIXED_CONTENT_ALWAYS_ALLOW
:允许从任何来源加载内容,即使起源是不安全的;
MIXED_CONTENT_NEVER_ALLOW:
不允许Https加载Http的内容,即不允许从安全的起源去加载一个不安全的资源;
MIXED_CONTENT_COMPATIBILITY_MODE
:当涉及到混合式内容时,WebView 会尝试去兼容最新Web浏览器的风格。
1.2 设置WebView接收所有网站证书
webView.setWebViewClient(new WebViewClient() {
@Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// handler.cancel();// Android默认的处理方式
handler.proceed();// 接受所有网站的证书
// handleMessage(Message msg);// 进行其他处理
}
});
结束的时候直接System.exit(0)
退出当前进程
2、WebView闪烁问题,解决如下
webView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
3、缩放引起的崩溃
webSettings.setDisplayZoomControls(true);为设置了允许进行缩放,这个缩放按钮会在出现后几秒消失,在部分系统里,如果在按钮消失前退出Activity,会导致系统崩溃,解决办法就是 将webSettings.setDisplayZoomControls(false),如果需要显示缩放按钮,就需要在Activity退出的时候,在onDesctory里进行销毁webView
4、Android 版本大于17的,
调用JS webSettings.setJavaScriptEnabled(true);需要加注解
@SuppressLint("SetJavaScriptEnabled")
5、外部JS攻击
由于应用中的WebView没有对file:///类型的url做限制,可能导致外部攻击者利用Javascript代码读取本地隐私数据。
5.1 如果WebView不需要使用file协议,直接禁用所有与file协议相关的功能即可(不影响对assets和resources资源的加载)。
//如果WebView不需要使用file协议,直接禁用所有与file协议相关的功能即可(不影响对assets和resources资源的加载) //进行如下三个设置即可 webSettings.setAllowFileAccess(false); webSettings.setAllowFileAccessFromFileURLs(false); webSettings.setAllowUniversalAccessFromFileURLs(false);
5.2 如果WebView需要使用file协议,则应该禁用file协议的Javascript功能。具体方法为:在调用loadUrl方法前,以及在shouldOverrideUrlLoading方法中判断url的scheme是否为file。如果是file协议,就禁用Javascript,否则启用Javascript。
//调用loadUrl前 if("file".equals(Uri.parse(url).getScheme())){//判断是否为file协议 webView.getSettings().setJavaScriptEnabled(false); }else{ webView.getSettings().setJavaScriptEnabled(true); } webView.loadUrl(url); //WebViewClient中做的操作 @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { if("file".equals(request.getUrl().getScheme())){//判断是否为file协议 view.getSettings().setJavaScriptEnabled(false); }else{ view.getSettings().setJavaScriptEnabled(true); } return false; }
6、WebViewClient 和 WebChromeClient 区别
在WebView设计中不是所有的都需要WebView干的,比如一些设置就需要WebSettings处理,WebView专心干好解析渲染工作,在使用WebView加载资源过程中,可能会有大量各种类型事件的回调,为了方便开发组处理这些回调,针对不同的事件回调,google将这些回调进行了分类集合,于是就产生了WebViewClient、WebChromeClient这两个大类。
这两大类有什么区别呢?
简单来说就是
- WebViewClient:在影响【View】的事件到来时,会通过WebViewClient中的方法回调通知用户
- WebChromeClient:当影响【浏览器】的事件到来时,就会通过WebChromeClient中的方法回调通知用法。
实际使用的话,如果你的WebView只是用来处理一些html的页面内容,只用WebViewClient就行了,如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient。