likes
comments
collection
share

webview_flutter_android 无法打开支付宝分析

作者站长头像
站长
· 阅读数 45

差异化版本

正常版本:webview_flutter_android: 3.16.0

错误版本:webview_flutter_android: 3.16.1 及以上

原因分析

通过断点调试,发现android_webview_controller.dart的 _handleNavigation 方法是问题所在

但是我只找到了问题的原因和问题发生的源头,没搞清楚这里为什么是这样,有知道的欢迎一起讨论!!!

3.16.1及以上版本

webview_flutter_android 无法打开支付宝分析

3.16.0 版本

webview_flutter_android 无法打开支付宝分析

可以看到3.16.0之后的版本新增了很重要的一个判断 !isForMainFrame,让我们看下上面的一段描述

// The client is only allowed to stop navigations that target the main frame because // overridden URLs are passed to loadUrl and loadUrl cannot load a subframe.

大概意思就是,loadUrl 只能加载主框架的导航,无法加载子框架的导航

webview_flutter_android 无法打开支付宝分析

支付宝收银台页面链接,isForMainFrame=true,没有走 return 代码正常往下走就是 loadUrl 加载页面,这里就不贴上后续代码了。

webview_flutter_android 无法打开支付宝分析

而到了调起支付支付宝url,isForMainFrame=false,在这一步直接就 return 了,导致后续的 loadUrl 没有执行无法打开页面,webview抛出了错误

isForMainFrame 从哪来

找到了失败原因,那就要分析 isForMainFrame 从哪里来,为什么会有这个差异

android_webview_controoler.dart

webview_flutter_android 无法打开支付宝分析

android_webview.g.dart webview_flutter_android 无法打开支付宝分析

从图中代码可以看到,isForMainFramearg_request的属性, 由安卓侧发送过来,那就去看安卓侧代码。

webview_flutter_android 无法打开支付宝分析 GeneratedAndroidWebView.java中找到了对应代码,这里只是接收了参数,具体逻辑还得往上找

webview_flutter_android 无法打开支付宝分析

WebViewClientHostApiImpl.java中调用了 requestLoading,传入了request,但是断点到这一步就终止了。

shouldOverrideUrlLoading在往上就是Android SDK 中的 WebviewClient.class和WebViewClientBoundaryInterface.java了。

目前尚不清楚这里的执行逻辑,有知道具体执行逻辑的,欢迎评论区留言。

webview_flutter_android 无法打开支付宝分析

webview_flutter_android 无法打开支付宝分析

webview_flutter_android 提交的pr中对这个修改进行了解释,但我没看懂这么做的原因,有知道的可以讨论下么

转载自:https://juejin.cn/post/7376465327360458790
评论
请登录