#### 问题汇总目录介绍 - 4.1.6 allowFileAccess漏洞 - 4.1.7 WebView嵌套ScrollView问题 - 4.1.8 WebView中图片点击放大 - 4.1.9 页面滑动期间不渲染/执行 - 4.2.0 被运营商劫持和注入问题 - 4.2.1 解决资源加载缓慢问题 - 4.2.2 判断是否已经滚动到页面底端 - 4.2.3 使用loadData加载html乱码 - 4.2.4 WebView下载进度无法监听 - 4.2.5 webView出现302/303重定向 - 4.2.6 onPageFinished偶发不执行 - 4.2.8 onReceiveError问题 - 4.2.9 loadUrl在19以上超过2097152个字符失效 - 4.3.0 WebViewJavascriptBridge: WARNING ### 4.1.6 allowFileAccess漏洞 - 如果webView.getSettings().setAllowFileAccess(boolean)设置为true,则会面临该问题;该漏洞是通过WebView对Javascript的延时执行和html文件替换产生的。 - 解决方案是禁止WebView页面打开本地文件,即:webView.getSettings().setAllowFileAccess(false); - 或者更直接的禁止使用JavaScript:webView.getSettings().setJavaScriptEnabled(false); ### 4.1.7 WebView嵌套ScrollView问题 - 问题描述 - 当 WebView 嵌套在 ScrollView 里面的时候,如果 WebView 先加载了一个高度很高的网页,然后加载了一个高度很低的网页,就会造成 WebView 的高度无法自适应,底部出现大量空白的情况出现。 - 解决办法 - 可以参考这篇博客:https://blog.csdn.net/self_study/article/details/54378978 ### 4.1.8 WebView中图片点击放大 - 首先载入js ``` //将js对象与java对象进行映射 webView.addJavascriptInterface(new ImageJavascriptInterface(context), "imagelistener"); ``` - html加载完成之后,添加监听图片的点击js函数,这个可以在onPageFinished方法中操作 ``` @Override public void onPageFinished(WebView view, String url) { X5LogUtils.i("-------onPageFinished-------"+url); //html加载完成之后,添加监听图片的点击js函数 //addImageClickListener(); addImageArrayClickListener(webView); } ``` - 具体看addImageArrayClickListener的实现方法。 ``` /** * android与js交互: * 首先我们拿到html中加载图片的标签img. * 然后取出其对应的src属性 * 循环遍历设置图片的点击事件 * 将src作为参数传给java代码 * 这个循环将所图片放入数组,当js调用本地方法时传入。 * 当然如果采用方式一获取图片的话,本地方法可以不需要传入这个数组 * 通过js代码找到标签为img的代码块,设置点击的监听方法与本地的openImage方法进行连接 * @param webView webview */ private void addImageArrayClickListener(WebView webView) { webView.loadUrl("javascript:(function(){" + "var objs = document.getElementsByTagName(\"img\"); " + "var array=new Array(); " + "for(var j=0;j我是loadData() 的标题

  我是他的内容

"); webView.loadData(html, "text/html", "UTF-8"); ``` - 使用loadData()或 loadDataWithBaseURL()加载一段HTML代码片段 - data:是要加载的数据类型,但在数据里面不能出现英文字符:'#', '%', '\' , '?' 这四个字符,如果有的话可以用 %23, %25, %27, %3f,这些字符来替换,在平时测试时,你的数据时,你的数据里含有这些字符,但不会出问题,当出问题时,你可以替换下。 * %,会报找不到页面错误,页面全是乱码。乱码样式见符件。 * #,会让你的goBack失效,但canGoBAck是可以使用的。于是就会产生返回按钮生效,但不能返回的情况。 * \ 和? 我在转换时,会报错,因为它会把\当作转义符来使用,如果用两级转义,也不生效,我是对它无语了。 - 我们在使用loadData时,就意味着需要把所有的非法字符全部转换掉,这样就会给运行速度带来很大的影响,因为在使用时,在页面stytle中会使用很多%号。页面的数据越多,运行的速度就会越慢。 - data中,有人会遇到中文乱码问题,解决办法:参数传"utf-8",页面的编码格式也必须是utf-8,这样编码统一就不会乱了。别的编码我也没有试过。 - 解决办法 ``` String html = new String("

我是loadData() 的标题

  我是他的内容

"); webView.loadData(html, "text/html;charset=UTF-8", "null"); ``` ### 4.2.4 WebView下载进度无法监听 - https://www.jianshu.com/p/6e38e1ef203a ### 4.2.5 webView出现302/303重定向 - 专业叙述 - 302重定向又称之为302代表暂时性转移 - 网络解释 - 重定向是网页制作中的一个知识,几个例子跟你说明,假设你现在所处的位置是一个论坛的登录页面,你填写了帐号,密码,点击登陆,如果你的帐号密码正确,就自动跳转到论坛的首页,不正确就返回登录页;这里的自动跳转,就是重定向的意思。或者可以说,重定向就是,在网页上设置一个约束条件,条件满足,就自动转入到其它网页、网址 。比如,你输入一个网站链接,一般可以直接进入网站,如果出现错误,则又跳转到另外一个网页。 - 举个例子 - 叙述下这种问题的情况,就是WebView首先加载A链接,然后在WebView上点击一个B链接进行加载,B链接会自动跳转到C链接,这个时候调用WebView的goback方法,会返回到加载B链接,但是B链接又会跳转到C链接,从而导致没法返回到A链接界面(当然也有朋友说快速的按两次返回键-也就是连续触发了两次goback可以返回到A链接,但并不是所有用户都懂这个,而且操作上也很恶心。),这就是重定向问题。 - 实现WebView的滑动监听和优雅处理回退栈问题 - WebView能否知道某个url是不是301/302呢?当然知道,WebView能够拿到url的请求信息和响应信息,根据header里的code很轻松就可以实现,事实正是如此,交给WebView来处理重定向(return false),这时候按返回键,是可以正常地回到重定向之前的那个页面的。(PS:从上面的章节可知,WebView在5.0以后是一个独立的apk,可以单独升级,新版本的WebView实现肯定处理了重定向问题) - 但是,业务对url拦截有需求,肯定不能把所有的情况都交给系统WebView处理。为了解决url拦截问题,本文引入了另一种思想——通过用户的touch事件来判断重定向。具体可以看项目lib中的ScrollWebView! ### 4.2.6 onPageFinished偶发不执行 ### 4.2.8 onReceiveError问题 - https://www.jianshu.com/p/fcebd23cbebb ### 4.2.9 loadUrl在19以上超过2097152个字符失效 - 修改代码如下所示 ``` /** * loadUrl方法在19以上超过2097152个字符失效 */ private static final int URL_MAX_CHARACTER_NUM=2097152; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && javascriptCommand.length()>=URL_MAX_CHARACTER_NUM) { this.evaluateJavascript(javascriptCommand,null); }else { this.loadUrl(javascriptCommand); } ``` ### 4.3.0 WebViewJavascriptBridge: WARNING - 有时候会出现这种报错日志:WebViewJavascriptBridge: WARNING: javascript handler threw.", source: (1) - 发生这种错误的原因。在作者库的library下的assets中有个js文件,错误是在那里面出现的。 - 这里总结如下:两边互传数据最好做的是严格意义上的json字符串。最后一点,也是最重要的一点。 ``` try { handler(message.data, responseCallback); } catch (exception) { if (typeof console != 'undefined') { console.log("WebViewJavascriptBridge: WARNING: javascript handler threw.", message, exception); } } ``` - 上面的错误,是发生在WebViewJavascriptBridge.js的这里。。这里try catch发生错误。handler是js端给到的处理函数,也就是在js端的这个处理函数里发生任何错误,都会出现这个错误提示。导致大家无法获取准确的错误。 - 出现这个错误。 - 首先检查js端的代码。js端发生错误,就报上面的错误。所以首要是去找js端的错误。