- JavaScript 注入 (Hook 方案) —— 最常用
通过向网页注入 JS 代码,重写浏览器的 window.fetch 和 window.XMLHttpRequest。这是目前拦截 POST 请求体 (Body) 的唯一有效方式。
-
原理:在
atDocumentStart时注入脚本,保存原始fetch,在自定义的fetch中通过window.webkit.messageHandlers将请求数据传给 Native 侧,处理后再调用原始请求。 -
适用场景:需要修改请求参数、监控 API 流量或处理带有 Body 的 POST 请求。
-
工具推荐:成熟的开源库如 KKJSBridge 已封装了完善的
ajax/fetch hook方案,解决了 Body 丢失和同步请求等问题。GitHub
- 使用
WKURLSchemeHandler
这是苹果官方提供的自定义协议处理方式,但它有一个核心限制:不能拦截 https 或 http 等标准协议。
Apple Developer
-
原理:注册一个自定义协议(如
my-api://)。当网页请求该协议的资源时,Native 侧的webView(_:start:)会被触发,你可以完全自主控制返回的数据。 -
局限性:
-
不支持直接拦截 HTTPS 流量(尝试注册
https方案会导致崩溃)。 -
可能会面临 跨域 (CORS) 问题,因为自定义协议通常被浏览器视为不安全或跨源。
Stack Overflow +4
-
- 内容阻断器 (
WKContentRuleList)
如果你只是想屏蔽某些特定的 fetch 请求,而不是修改它们,可以使用这个方案。
- 原理:通过 JSON 定义规则,根据 URL 过滤并执行
block(阻断)操作。 - 优点:性能极高,由系统底层执行。
- 缺点:只能“拦截并丢弃”,无法获取请求内容或返回自定义数据。