推送WebView时出现NSURLErrorDomain Code=-999错误求助
NSURLErrorDomain Code=-999 问题排查与解决
问题场景:APP推送WebView时,控制台打印错误信息
NSURLErrorDomain Code=-999,对应HTML页面中存在WebViewbridge相关代码,相关日志如下:2018-05-01 10:34:54.189185+0800 FakeICBCBank[39093:7872256] webViewDidStartLoad 2018-05-01 10:34:54.728493+0800 FakeICBCBank[39093:7872355] WF: === Starting WebFilter logging for process FakeICBCBank 2018-05-01 10:34:54.729007+0800 FakeICBCBank[39093:7872355] WF: _userSettingsForUser : (null) 2018-05-01 10:34:54.729512+0800 FakeICBCBank[39093:7872355] WF: _W...
嘿,我来帮你拆解下这个问题~NSURLErrorDomain Code=-999对应的是请求被取消(NSURLErrorCancelled),结合你的WebViewBridge场景和日志,主要有几个常见触发原因,给你整理了对应的解决思路:
1. WebView加载中途被中断(最常见)
从日志能看到,webViewDidStartLoad触发后很快就出现了WebFilter的日志,很大概率是WebView加载过程被提前终止了,常见情况包括:
- H5页面还没加载完成,就触发了WebViewBridge的协议调用/跳转,直接打断了当前页面加载请求
- Native侧在WebView加载过程中不小心调用了
stopLoading方法(比如页面切换时的清理逻辑没处理到位) - 页面内部的iframe跳转、
location.href改变和WebViewBridge的调用发生冲突
解决办法:
- 调整WebViewBridge初始化时机:等WebView触发
webViewDidFinishLoad后,再通知H5页面初始化桥接代码;或者在H5里监听DOMContentLoaded事件后再启动桥接逻辑 - 检查Native代码,确认有没有在加载过程中意外停止WebView加载的逻辑
2. WebFilter或URL拦截导致请求被取消
日志里出现了WF: === Starting WebFilter logging,说明系统的WebFilter在运作,可能的原因是:
- 系统开启了内容拦截(比如家长控制、第三方广告拦截工具),把WebViewBridge相关的请求拦下来了
- APP内部的URL过滤逻辑,没有把WebViewBridge用的自定义协议(比如
wvbridge://这类)加入白名单,导致请求被拦截取消
解决办法:
- 检查APP的URLScheme白名单配置,确保WebViewBridge使用的自定义协议被允许通过
- 测试时暂时关闭系统的内容拦截功能,排查是否是外部因素导致的问题
3. WebViewBridge初始化时机不对
如果H5页面刚启动就尝试调用Native桥接方法,此时WebView还没完成和Native的通信初始化,就可能触发请求被取消:
- 比如页面一加载就调用
window.webkit.messageHandlers(iOS)的方法,这时候WebView还没准备好接收桥接请求,直接导致当前加载请求被中断
解决办法:
- 让Native在
webViewDidFinishLoad回调中给H5发一个初始化完成的信号,H5收到信号后再启动桥接逻辑 - 给桥接调用加上错误捕获逻辑,就算初始化失败也不会影响整个页面的加载
额外排查小技巧
- 打开iOS的Safari开发者工具,连接APP的WebView,查看网络请求面板,明确是哪个请求被取消了,是不是WebViewBridge相关的请求
- 在Native的
webView:didFailLoadWithError:回调里打印完整的错误信息,说不定能拿到更详细的错误描述,帮助定位问题
内容的提问来源于stack exchange,提问作者Ran
相关产品推荐
相关产品推荐

