ios webview 三种拦截方案

3 阅读1分钟
  1. JavaScript 注入 (Hook 方案) —— 最常用

通过向网页注入 JS 代码,重写浏览器的 window.fetch 和 window.XMLHttpRequest。这是目前拦截 POST 请求体 (Body)  的唯一有效方式。

  • 原理:在 atDocumentStart 时注入脚本,保存原始 fetch,在自定义的 fetch 中通过 window.webkit.messageHandlers 将请求数据传给 Native 侧,处理后再调用原始请求。

  • 适用场景:需要修改请求参数、监控 API 流量或处理带有 Body 的 POST 请求。

  • 工具推荐:成熟的开源库如 KKJSBridge 已封装了完善的 ajax/fetch hook 方案,解决了 Body 丢失和同步请求等问题。 

    GitHubGitHub

  1. 使用 WKURLSchemeHandler

这是苹果官方提供的自定义协议处理方式,但它有一个核心限制:不能拦截 https 或 http 等标准协议。 

Apple DeveloperApple Developer

  • 原理:注册一个自定义协议(如 my-api://)。当网页请求该协议的资源时,Native 侧的 webView(_:start:) 会被触发,你可以完全自主控制返回的数据。

  • 局限性

    • 不支持直接拦截 HTTPS 流量(尝试注册 https 方案会导致崩溃)。

    • 可能会面临 跨域 (CORS)  问题,因为自定义协议通常被浏览器视为不安全或跨源。 

      Stack OverflowStack Overflow +4

  1. 内容阻断器 (WKContentRuleList)

如果你只是想屏蔽某些特定的 fetch 请求,而不是修改它们,可以使用这个方案。

  • 原理:通过 JSON 定义规则,根据 URL 过滤并执行 block(阻断)操作。
  • 优点:性能极高,由系统底层执行。
  • 缺点:只能“拦截并丢弃”,无法获取请求内容或返回自定义数据。