WKWebView出现activityTimedOut错误无法通过代理捕获该如何处理
解决方案
核心原因
你遇到的是WKWebView独立的WebContent进程被系统超时回收的场景:
- 你用到的两个
didFail系列回调仅在页面导航加载过程中发生错误时触发,比如域名解析失败、网络异常、服务端返回错误码等场景 TimedActivity::activityTimedOut和com.apple.WebKit.WebContent报错属于WebKit内核进程生命周期异常,不属于导航错误,因此不会触发上述两个回调
捕获方法
iOS 9.0+ 官方原生方案
直接实现WKNavigationDelegate的webViewWebContentProcessDidTerminate回调即可,该方法会在WebContent进程被系统终止(包括超时回收、内存不足被杀、进程异常崩溃等所有场景)时触发,直接在回调内执行重载逻辑即可:
func webViewWebContentProcessDidTerminate(_ webView: WKWebView) { // 捕获到进程终止,直接重新加载页面 webView.reload() }
低版本兼容方案
如果需要适配iOS 9以下的系统,可以通过定时心跳检测判断进程是否存活:
- 每隔固定间隔(比如30s)调用
evaluateJavaScript执行一段简单逻辑,判断是否返回错误 - 若回调返回错误,说明WebContent进程已失效,主动执行reload即可
示例代码:
// 定时检测web进程是否存活 Timer.scheduledTimer(withTimeInterval: 30, repeats: true) { [weak self] _ in guard let self = self else { return } self.webView.evaluateJavaScript("1") { _, error in if error != nil { // 进程已失效,重新加载 self.webView.reload() } } }
额外优化建议
如果频繁出现该超时错误,建议排查前端页面是否存在以下问题:
- 存在未释放的长定时任务、死循环逻辑
- 页面内存占用持续上涨未释放
- 长时间运行 heavy computation 类逻辑
内容的提问来源于stack exchange,提问作者William Hu
相关产品推荐
相关产品推荐

