FSA全栈行动 FSA全栈行动
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr

公众号:FSA全栈行动

记录学习过程中的知识
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr
  • AndroidUI

  • Android第三方SDK

  • Android混淆

  • Android仓库

  • Android新闻

  • Android系统开发

  • Android源码

  • Android注解AOP

  • Android脚本

  • AndroidTv开发

  • AndroidNDK

  • Android音视频

  • Android热修复

  • Android性能优化

  • Android云游戏

  • Android插件化

  • iOSUI

  • iOS工具

  • iOS底层原理与应用

  • iOS组件化

  • iOS音视频

  • iOS疑难杂症

  • iOS之Swift

  • iOS之RxSwift

  • iOS开源项目

  • iOS逆向

  • Flutter开发

    • Dart - 抽象类的实例化
    • Flutter - 打印好用的Debug日志
    • Flutter - 混合开发
    • Flutter - 解决混合开发iOS脚本打包遇到的问题
    • Flutter - 低版本在iOS14上遇到的问题与解决方案
    • Flutter - 解决原生弹窗的触摸事件被Flutter响应的问题
    • Flutter - 实现列表上下拉切换header
    • Flutter - 获取ListView当前正在显示的Widget信息
    • Flutter - 列表滚动定位超强辅助库,墙裂推荐!🔥
    • Flutter - 快速实现聊天会话列表的效果,完美💯
    • Flutter - 聊天输入框更新文本时的必备优化点🔖
    • Flutter - 我给官方提PR,解决run命令卡住问题 😃
    • Flutter - 探索run命令到底做了什么 🤔
    • Flutter - 引擎调试(iOS篇)🛠
    • Flutter - 引擎调试bug到提交PR实战 🐞
    • Flutter - 船新升级😱支持观察第三方构建的滚动视图💪
    • Flutter - 瀑布流交替播放视频 🎞
    • Flutter - IM保持消息位置大升级(支持ChatGPT生成式消息) 🤖
    • Flutter - 滚动视图中的表单防遮挡 🗒
    • Flutter - 秒杀1/2曝光统计 📊
    • 一天内加入 Flutter 和 FlutterCandies 两大组织是什么体验 🧐
    • Flutter - 如何快速搓一个微信通讯录列表(azlist) 📓
    • Flutter - 混编项目集成Shorebird热更新🐦(安卓篇)
    • Flutter - 混编项目集成Shorebird热更新🐦(iOS篇)
    • Flutter - 解决返回原生页面时dispose方法未被触发的问题 🐞
    • Flutter - 升级3.19之后页面多次rebuild?🤨
    • Flutter - 热更新 Shorebird 1.0 正式版来了 🐦
    • Flutter - 使用Pigeon实现视频缓存插件 🐌
    • Flutter - 轻松搞定屏幕旋转功能 😎
    • Flutter - 解决Connection closed before full header was received
    • Flutter - 实现聊天键盘与功能面板的丝滑切换 🍻
    • Flutter - 支持观察NestedScrollView,兼容性更强 😈
    • Flutter - 聊天键盘与面板丝滑切换的强势升级 🍻
    • Flutter - 升级到3.24后页面还会多次rebuild吗?🧐
    • Flutter - 轻松实现PageView卡片偏移效果
    • Flutter - 轻松搞定炫酷视差(Parallax)效果
    • Flutter - 危!3.24版本苹果审核被拒!
    • Flutter - 子部件任意位置观察滚动数据
    • Flutter - iOS编译加速
    • Flutter - Xcode16 还原编译速度
    • Flutter - GetX Helper 助你规范应用 tag
    • Flutter - GetX Helper 如何应用于旧页面
    • Flutter - 聊天面板库动画生硬?这次让你丝滑个够
    • Flutter - 使用本地 DevTools 验证 SVG 加载优化
    • Flutter - 详情页 TabBar 与模块联动?秒了!
    • Flutter - 详情页初始锚点与优化
    • Flutter - Melos Pub workspaces 实践
    • Flutter webview 崩溃率上升怎么办?我的分析与解决方案
      • 前言
      • 复现
      • 修复
      • 使用
      • 最后
  • 移动端
  • Flutter开发
LinXunFeng
2025-10-19
目录

Flutter webview 崩溃率上升怎么办?我的分析与解决方案

欢迎关注微信公众号:[FSA全栈行动 👋]

# 前言

我们 App 的 Flutter 版本从 3.27.4 升级到 3.29.3 并上线后,发现 Firebase Crashlytics 平台上多了一个仅 iOS 端才会的船新崩溃异常~

完整错误为:

Fatal Exception: NSInternalInconsistencyException
Completion handler passed to -[FWFNavigationDelegate webView:didReceiveAuthenticationChallenge:completionHandler:] was not called

除此之外,也有如下两个差不多的异常,只是没这个 AuthenticationChallenge 的多。

Completion handler passed to -[webview_flutter_wkwebview.NavigationDelegateImpl webView:didReceiveAuthenticationChallenge:completionHandler:] was not called

Completion handler passed to -[webview_flutter_wkwebview.NavigationDelegateImpl webView:decidePolicyForNavigationResponse:decisionHandler:] was not called

崩溃的主要原因就是这些代理方法被调用后,其 completionHandler 必须也得被执行,否则就崩给你看。

相应的 issue : https://github.com/flutter/flutter/issues/102476 (opens new window)

很奇怪,issue 是 2022 年提的,提出人当时使用的 Flutter 版本是 2.10.4,直至今天这期间都有人断断续续提出在不同的 Flutter 版本上出现过,而我们是在升级至 3.29.3 才出现的~

经测试,目前最新版本的 Flutter 3.35.6 和 webview_flutter_wkwebview 3.23.1 依旧可以复现。

# 复现

我们 App 涉及崩溃的设备有 98% 发生在后台状态

根据以往的经验,基本上可以断定是发生在上滑后杀掉 App 的那一刻,所以复现步骤也很简单:

1、Xcode 打全局断点并运行项目

2、进入内嵌页后,网页还在加载时立即上滑,再杀掉 App 即可

不过这也并不是百分之百复现的,既看时机,也看人,我也就十来次操作复现一次~

下图是我复现时的记录输出

可以看到崩溃时有多个 completionHandler 还没有被调用

# 修复

基于上述内容,基本上可以断定这个崩溃其实对用户来说是无感的,但是对我们 App 的崩溃率指标是敏感的,所以在官方修复之前,必须得有临时解决方案。

有两种方案,一是通过 Firebase 过滤掉此类崩溃,想法很好,但是 Firebase 并没有直接提供过滤功能,根据官方文档的说明,只能关闭自动收集崩溃上报功能,然后完全自定义上报异常,简直了,一个对用户无感的崩溃,不至于冒这么大的风险~

于是,Plan B 启动!

众所周知,iOS 是有黑魔法的,而刚好我之前就是搞 iOS 的。

核心思路:

  • 通过 Method Swizzling 将涉及崩溃的代理方法进行交换,进而监听方法调用和控制其 completionHandler 的调用
  • 在代理方法被调用时将 completionHandler 记录起来
  • 在 completionHandler 被调用时删除记录
  • 在 App 即将被杀掉时,对所有还未被调用的 completionHandler 执行调用

这个代码的实现过程就不带大家一步步分析了,有兴趣的小伙伴可以自行查看源码。

我已将修复代码进行了封装并发布了包

https://github.com/LinXunFeng/flutter_webview_completion_fix (opens new window)

接下来看看如何使用

# 使用

添加依赖安装即可,无需其它额外配置,凑是这么方便~

dependencies:
  webview_completion_fix: ^0.0.1

如果你想验证修复是否生效,可以在 ios/Runner/Info.plist 添加如下配置开启日志

<key>WCFEnableLogging</key>
<true/>

开启后如图会有 [WCF] 打头的日志输出

如倒数第 3 行所示,当杀掉 App 时,有 2 个 completionHandler 还未被调用,并进行挽救调用防止崩溃。

# 最后

经过验证,我们新版本的 App 已经没有上报此类异常了~

好了,开源不易,如果你也觉得这个库好用,请不吝给个 Star 👍 ,并多多支持!

https://github.com/LinXunFeng/flutter_webview_completion_fix (opens new window)

本篇到此结束,感谢大家的支持,我们下次再见! 👋

#Dart#Flutter#WebView
上次更新: 2025/10/19, 05:36:23
Flutter - Melos Pub workspaces 实践

← Flutter - Melos Pub workspaces 实践

最近更新
01
Flutter - Melos Pub workspaces 实践
10-12
02
Flutter - 详情页初始锚点与优化
08-24
03
Flutter - 详情页 TabBar 与模块联动?秒了!
08-17
更多文章>
Theme by Vdoing | Copyright © 2020-2025 FSA全栈行动
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×