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

追问

  1. 如何只拦截特定域名请求? — URL 前缀判断,命中才处理,其余返回 null
  2. 拦截后如何修改请求头? — Android 无法直接修改请求头,需重新发 HttpURLConnection 并附带头信息
  3. 离线包方案如何实现? — 拦截请求后从本地 Zip 读取文件返回,版本号控制更新
  4. iOS 为什么不能拦截 https? — Apple 安全策略限制,需改用自定义 Scheme 或 ATS 例外
标签:Webview