webview_flutter_android 无法打开支付宝分析
差异化版本
正常版本:webview_flutter_android: 3.16.0
错误版本:webview_flutter_android: 3.16.1 及以上
原因分析
通过断点调试,发现android_webview_controller.dart的 _handleNavigation 方法是问题所在
但是我只找到了问题的原因和问题发生的源头,没搞清楚这里为什么是这样,有知道的欢迎一起讨论!!!
3.16.1及以上版本
3.16.0 版本
可以看到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 只能加载主框架的导航,无法加载子框架的导航
支付宝收银台页面链接,isForMainFrame=true,没有走 return 代码正常往下走就是 loadUrl 加载页面,这里就不贴上后续代码了。
而到了调起支付支付宝url,isForMainFrame=false,在这一步直接就 return 了,导致后续的 loadUrl 没有执行无法打开页面,webview抛出了错误
isForMainFrame 从哪来
找到了失败原因,那就要分析 isForMainFrame 从哪里来,为什么会有这个差异
android_webview_controoler.dart
android_webview.g.dart
从图中代码可以看到,isForMainFrame 为arg_request的属性, 由安卓侧发送过来,那就去看安卓侧代码。
GeneratedAndroidWebView.java中找到了对应代码,这里只是接收了参数,具体逻辑还得往上找
WebViewClientHostApiImpl.java中调用了 requestLoading,传入了request,但是断点到这一步就终止了。
shouldOverrideUrlLoading在往上就是Android SDK 中的 WebviewClient.class和WebViewClientBoundaryInterface.java了。
目前尚不清楚这里的执行逻辑,有知道具体执行逻辑的,欢迎评论区留言。
webview_flutter_android 提交的pr中对这个修改进行了解释,但我没看懂这么做的原因,有知道的可以讨论下么
转载自:https://juejin.cn/post/7376465327360458790