5月29日 22:54
WebView 如何拦截和修改网络请求?shouldInterceptRequest 能做什么?
WebView 如何拦截和修改网络请求?shouldInterceptRequest 能做什么?
Android 用 shouldInterceptRequest(WebViewClient),iOS 用 WKURLSchemeHandler(WKWebView)拦截请求,可读取 URL/Headers 并返回自定义响应。
Android shouldInterceptRequest:
- 非 UI 线程回调,不可操作 View
- 返回 WebResourceResponse 即替换原始响应,返回 null 走默认逻辑
- 仅拦截 GET/POST 等 HTTP 请求,不拦截 XHR fetch(部分版本)
iOS WKURLSchemeHandler:
- 需注册自定义 Scheme(如 custom://),https scheme 无法拦截
- 实现 startURLSchemeTask / stopURLSchemeTask
- 返回数据通过 didReceiveResponse + didReceiveData 回调
核心用途:本地缓存替换、请求头注入(Token)、CDN 域名替换、离线包加载。
注意事项:
- 性能:拦截所有请求会拖慢页面,需按 URL 前缀过滤
- 线程安全:Android 回调在非 UI 线程,不能直接操作 UI
- HTTPS 限制:iOS 不允许拦截 https,必须用自定义 Scheme
- 缓存一致:替换响应后需正确设置 mimeType 和 encoding
追问
- 如何只拦截特定域名请求? — URL 前缀判断,命中才处理,其余返回 null
- 拦截后如何修改请求头? — Android 无法直接修改请求头,需重新发 HttpURLConnection 并附带头信息
- 离线包方案如何实现? — 拦截请求后从本地 Zip 读取文件返回,版本号控制更新
- iOS 为什么不能拦截 https? — Apple 安全策略限制,需改用自定义 Scheme 或 ATS 例外