- Android webView 8.0系统 部分手机无法跳转页
- Nexus Android8.0系统拍照预览方向问题解决方法
- Android WebView Https 无法加载图片问题修复
- Android WebView 5.x 系统下 Error in
- Android 踩坑记1---------Android8.0自
- Android 8.0 WebView崩溃处理
- Android O 8.0及其以上系统的通知(Notificat
- Android PackageManagerService服务工
- Android8.0 WebView返回上一层失效(canGoB
- 2018-04-20 Android8.0 WebView返回上
最近公司项目出现一个奇怪的问题,webView
跳转页面的时候,在Android 8.0系统的oppo Vivo 还有三星手机无法跳转第三方存管页面,而跳转我们前端自己写的页面的时候是可以跳转的,顿时就有些郁闷了,难不成又被webView
给坑了?萌生了想要把现有的原生webView
给干掉,用开源的腾讯x5或者agentWeb
给替换掉算了。不过还是想着先把问题给解决了再说。
查找解决问题方案
话不多少,直接去复查代码,打断点看到底是个啥子问题。打断点后发现跳转存管页面时,会进入shouldOverrideUrlLoading
方法,当时的代码是这样子写的:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
MyLog.d(TAG, "==> shouldOverrideUrlLoading url = " + url);
view.loadUrl(url);
return true;
}
想着这个过滤重定向请求的重写方法也没毛病呀,有点不放心,还是网上搜索一些资料,发现别人也都是这样子写的呀,这个算是一个比较标准的写法了,而且我们也没有需求要拦截特定url链接。这个就有点纳闷了,是不是自己webView的某些配置没有到位呢?这里先贴出我当前webView
的一些配置信息,如下:
private void initWebView() {
mWebSettings = mProgressWebView.getSettings();
mWebSettings.setJavaScriptEnabled(true);
//设置自适应屏幕,两者合用
mWebSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
mWebSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
//缩放操作
mWebSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
mWebSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
mWebSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件
mWebSettings.setDomStorageEnabled(true);
mWebSettings.setAppCacheMaxSize(1024 * 1024 * 8);
String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();
mWebSettings.setAppCachePath(appCachePath);
mWebSettings.setAllowFileAccess(true);
mWebSettings.setAppCacheEnabled(true);
//是否可以后退
mProgressWebView.canGoBack();
//是否可以前进
mProgressWebView.canGoForward();
mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
// 关闭WebView的自动保存密码功能,防止用户密码被WebView明文存储 @author Steven created at 2018/1/22
mWebSettings.setSavePassword(false);
}
感觉也没啥毛病呀,该配置的都已经配置好了呀,再去网站上查找了一些资料,添加有可能未配置会出现该问题。添加的配置如下:
// 设置WebView的属性使其支持内容重新布局
mWebSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
mWebSettings.setDefaultTextEncodingName("utf-8");
// 提高渲染的优先级
mWebSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
this.mProgressWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
// 开启第三方cookie的支持
if (android.os.Build.VERSION.SDK_INT >= 21) {
CookieManager.getInstance().setAcceptThirdPartyCookies(mProgressWebView, true);
}else {
CookieManager.getInstance().setAcceptCookie(true);
}
配置之后发现,依然没有啥用呀...照样的还是跳转不过去。
寻找备用方案
既然暂时找不出什么问题,而且时间紧迫,BUG得改呀,不能一直拖着,那就只能想别的替代方案了,没办法,只能换一下坑爹webView
了。看了一下腾讯的X5以及agentWeb
,开始想要集成X5来着,毕竟是大厂出品嘛,还是可靠一点,但是一看他们的集成文档,步骤都有十步,还要下载 SDK jar 包放到工程的libs目录下,将源码和XML里的系统包和类替换为SDK里的包和类。感觉有点麻烦,就想着还是用agentWeb
吧,毕竟这也是个备选方案,看能不能先把当前BUG先解决了,再回头找出问题所在。
然后就是动手将原生的 webView
替换成 agentWeb
啦,还是比较简单的,替换的过程中也没有发现什么问题(当然原有的webView
类还是没有删除的,就怕到时候找出问题了还得还原代码)。几乎是把原来 weiVIew
里面的东西全部挪过去了,然后再尝试一下跳转存管页面,结果还是令人挺满意的,完全没有问题呀!!!可以进行跳转,当时的想法就是,坑爹的webView
呀,爸爸要将你抛弃!!
agentWeb
采用的就是默认配置
mAgentWeb = AgentWeb.with(this)
.setAgentWebParent(mLlContainer, new LinearLayout.LayoutParams(-1, -1))
.useDefaultIndicator()
.setWebChromeClient(mWebChromeClient)
.setWebViewClient(mWebViewClient)
.setSecurityType(AgentWeb.SecurityType.STRICT_CHECK)
.createAgentWeb()
.ready()
.go(mWebParams);
定位解决问题
当然如果只是到这里的话,就不关Bugly啥事了。虽然这个是可以用了,但是之前的问题还得找出来呀,毕竟这个只是一个紧急的备选处理方案,而且对 agentWeb
没有太多的研究,到时候出问题了怎么破。而在这个时候,测试的小姐姐(公司开发部测试还是有几个小姐姐的)说之前4.6.4版本在这些不能跳转的机型上的是可以跳转存管页面的,但是现在的4.6.6不能跳转。
???当时我就一脸懵逼,这个webView
的Activity
(后文就用WebViewActivity
来替代了)已经很久没有进行更改过了的感觉呀,怎么会之前的可以,而现在的不行呢?那没有办法,赶紧查看一下代码上传记录,因为隔了两个版本,代码上传的有点多,而且发现有两处地方进行更改过,可能导致这个部分机型不能跳转的兼容问题。
- 在4.6.4之后,对
gradle
进行了升级 - 公用的
WebViewActivity
进行更改过
因为之前同事就碰到过升级gradle
然后出现了一些莫名其妙的问题,比如在与web
交互的时候,写的方法明明是在主线程进行更新UI,打印出当前线程也是主线程,结果还是有问题,结果硬是在那个方法中用Handler
发送了一条消息到主线程中进行更新UI才成功,完全没搞懂是个啥操作....这个就不细说了。当时我就觉得不会是gradle
在作怪吧,那就有点难顶了呀。想想这个先不管了,先把WebViewActivity
中更改过的代码还原一下,看能不能跳转吧。
嗯...还原回去还真能跳转,不是更新gradle
导致的问题,先松了口气,然后一步一步的尝试,到底是改到哪个地方导致无法跳转呢?结果让我大跌眼镜,找到了万恶之源,部分代码如下(只贴出了导致问题的代码):
mProgressWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
boolean isSuccess = CrashReport.setJavascriptMonitor(mProgressWebView, true);
MyLog.e(TAG, "WebViewActivity.initWebView:Bugly Javascript的异常捕获功能是否成功:" + isSuccess);
super.onProgressChanged(view, newProgress);
}
}
而为什么会加上这行代码呢,因为之前领导说尽量捕获一些错误日志,然后上报定位问题,所以领导说了的咱也要听呀,所以就有了这个行代码的故事,捕获Javascript
异常,提供给前端同事进行优化。而这行代码也不是瞎加的呀,是根据Bugly的官方文档加上去的呀。
然后就是这两行代码导致了Android 8.0系统的oppo Vivo 还有三星手机无法跳转存管页面,删除之后就能跳转了,当然这个存管页面也确实是有JS错误,但是有JS错误你也得给我跳转过去呀...真的是有点难受。
Bugly错误日志截图.png总结
经过此次事件让我学习到不要太过于相信大厂的框架,即便是强如腾讯大厂出品的拥有重多用户量的Bugly依然存在兼容性问题,当然这也从侧面表现出Android系统的混乱性以及兼容的复杂度,即便是大厂同样有兼容性的问题,所以Android开发各个系统的兼容性还有很大的探索空间以及提升。
当然如果你的项目中也有用到Bugly,并且使用了JS异常捕获功能,那你也得小心一点了,指不定哪天你的部分机型跳转web
页面就不能跳转了,还是得谨慎使用呀!当然说不定腾讯大佬看到我的这篇文章就偷偷的把这个问题给优化了呢。哈哈哈,这样子当时是最好的啦。
网友评论