WebView播放视频点击全屏触发NSURLConnection -1003错误如何解决
报错信息
运行时抛出错误:NSURLConnection finished with error - code -1003
注:该错误码对应NSURLErrorCannotFindHost,含义为域名解析失败,无法找到请求对应的服务器主机
复现场景
- 加载部署在DataServer上的视频URL做展示,视频在WebView内嵌状态下可以正常加载、播放
- 点击视频控件的全屏播放按钮时,立刻触发上述报错,无法进入全屏播放
- 相关参考截图:
- 已尝试常规网络排查、配置调整类方案,问题均未解决
根因说明
WebView内嵌播放视频时,视频请求由WebView在APP进程内发起,会自动复用WebView的请求上下文:包括自定义Cookie、请求头、NSURLProtocol拦截规则、APP内自定义DNS解析、APP级代理/VPN配置等,因此即使视频域名是私有映射域名、需要特殊鉴权/拦截才能访问,内嵌状态下也能正常加载。
点击全屏按钮后,iOS系统会将视频播放权接管给系统级原生播放器组件(由mediaserverd系统进程发起请求,不属于APP进程管辖范围),不会复用APP内WebView的任何自定义网络配置,直接用系统全局DNS解析视频域名,就会出现解析失败、找不到主机的-1003报错。
可落地修复方案
- 方案1:绕开系统原生全屏接管,在WebView内实现全屏效果
配置WKWebView的allowsInlineMediaPlayback属性为YES,同时前端页面给video标签添加playsinline、webkit-playsinline属性,强制视频始终内联播放;拦截前端全屏按钮点击事件,通过CSS将视频DOM区域撑满整个WebView视图,模拟全屏展示效果,全程不触发系统播放器接管,从根源避免跨进程请求的解析问题。 - 方案2:替换全屏播放的视频源为系统可直接访问的地址
实现WKWebView的导航代理/脚本监听,在监听到视频即将触发全屏播放的事件时,提取当前视频地址,提前将需要APP内自定义解析/鉴权的地址,转换为带访问签名、公网可直接解析、不需要特殊网络配置就能访问的绝对URL,把该地址传给原生播放器做全屏播放,避免系统进程解析域名失败。 - 方案3:全局网络配置适配
如果视频域名是固定私有域名,不要仅在APP内做域名映射/拦截,需要将域名解析规则配置为系统全局可识别的规则,确保系统媒体服务进程也能正常解析该域名对应的服务器IP;同时排查确认视频URL不是WebView内生成的相对路径地址,必须传完整带协议、域名的绝对URL给播放器。
内容的提问来源于stack exchange,提问作者STARK
相关产品推荐
相关产品推荐

