You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WKNavigationDelegate中didFail与didFailProvisionalNavigation的区别及疑问

WKWebView导航失败代理方法的差异与实践

问题1:两种错误的具体差异是什么?

这两个方法对应WKWebView导航流程的不同阶段:

  • webView(_:didFailProvisionalNavigation:withError:):触发于导航未正式提交的早期阶段,还未完成服务器响应接收或页面资源加载初始化。常见场景包括DNS解析失败、网络连接超时、SSL证书验证失败、内容拦截器阻止页面加载、请求被服务器提前拒绝(如401未授权)等。
  • webView(_:didFail:withError:):触发于导航已正式启动后的阶段——此时已成功建立连接、收到服务器响应,页面资源开始加载,但中途出现错误。常见场景包括加载过程中网络突然中断、页面关键资源(如脚本、样式)损坏或加载失败、JavaScript执行抛出未捕获异常导致页面崩溃等。

问题2:是否有对应每种方法的错误列表?

苹果官方并未公开细分到这两个方法的专属错误列表,但可以根据错误域和场景大致归纳:

对应didFailProvisionalNavigation的常见错误

  • NSURLErrorDomain:DNS查找失败(NSURLErrorCannotFindHost,错误码-1003)、连接超时(NSURLErrorTimedOut,-1001)、SSL证书错误(NSURLErrorServerCertificateUntrusted等-1200系列错误)、请求重定向次数过多(NSURLErrorRedirectTooManyTimes,-1007)
  • WKErrorDomain:页面被内容拦截器阻止(WKErrorContentBlocked,-1023)、导航被禁止(WKErrorNavigationDisabled,-1024)

对应didFail的常见错误

  • NSURLErrorDomain:加载过程中网络连接断开(NSURLErrorNetworkConnectionLost,-1005)、资源无法访问(NSURLErrorCannotLoadResource,-1008)
  • WKErrorDomain:JavaScript执行异常(WKErrorJavaScriptException,-1026)
  • 页面内嵌的第三方资源(如视频、音频)加载失败也可能触发该方法。

问题3:既然主流浏览器未处理didFail,何时需要对其进行处理?

主流浏览器仅处理didFailProvisionalNavigation,是因为这类错误直接导致页面无法启动加载,属于用户感知强烈的“加载失败”场景;而didFail触发的错误大多是页面加载中途的异常,浏览器自身已有兜底逻辑(如显示错误提示、允许刷新)。

但在以下场景中,你需要主动处理webView(_:didFail:withError:):

  • App依赖页面中的关键业务资源(如支付脚本、用户信息组件),若这些资源加载失败需触发特定业务逻辑(如切换到原生界面、提示用户重试);
  • 需要监控页面加载中途的JavaScript异常,用于错误统计或用户反馈;
  • 页面加载过程中需要自定义网络中断后的重试逻辑(如自动重新加载、显示个性化提示);
  • 处理特殊导航错误(如页面跳转时目标资源损坏,需回退到上一页或引导用户其他操作)。

内容的提问来源于stack exchange,提问作者Agost Biro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:40:51