使用 Proxyman 拦截 iOS 18 WKWebView 的 HTTP/HTTPS 请求
1. 问题
使用 WKWebView 时,由于它不遵循系统代理设置,因此很难抓取网络流量(HTTP/HTTPS)。
WKWebView 也不像 Safari 那样提供 Network 控制台标签页。
因此,目前没有简单的方法可以抓取 WKWebView 的网络流量。
本文涵盖以下内容:
- 如何使用 Proxyman 抓取 iOS 17 或 iOS 18 中 WKWebView 的 HTTPS 流量
2. 解决方案
从 iOS 17 和 iOS 18 开始,WKWebView 在 WKWebsiteDataStore 中引入了 proxyConfigurations。它允许我们为 WKWebView 设置代理。利用这一特性,我们就能轻松抓取 WKWebView 的网络流量。
你可以在这里查看文档:https://developer.apple.com/documentation/webkit/wkwebsitedatastore/4264546-proxyconfigurations
本教程演示如何使用 Proxyman 抓取 iOS 17/18 中 WKWebView 的网络流量。
2.1. 前提条件
- 从 Proxyman 官网下载 Proxyman
2.2. 设置
- 在 Xcode 中打开你的项目
- 找到你当前的
WKWebView实例,并添加以下代码
lazy var webView: WKWebView = {
let webConfiguration = WKWebViewConfiguration()
// ✅ define Proxy Setting to Proxyman
let httpProxy = ProxyConfiguration(
httpCONNECTProxy: NWEndpoint.hostPort(
host: NWEndpoint.Host(
"127.0.0.1"
),
port: NWEndpoint.Port(
integerLiteral: 9090
)
)
)
// ✅ Tell WKWebView to use the Proxy
let dataSource = WKWebsiteDataStore.default()
dataSource.proxyConfigurations = [httpProxy]
webConfiguration.websiteDataStore = dataSource
// init view
let webView = WKWebView(
frame: .zero,
configuration: webConfiguration
)
webView.translatesAutoresizingMaskIntoConstraints = false
return webView
}()
- 请将
127.0.0.1和9090替换为你的 Proxyman IP 和端口,这里的值是 Proxyman 的默认值。 - 如果在真机上测试,你需要 macOS 的 IP 地址,它可以在 Proxyman 窗口顶部的 Proxyman 工具栏中找到。

iOS 模拟器
- 通过 Proxyman -> Certificate 菜单 -> Install to iOS -> Simulator -> Follow the instruction,将证书安装到你的 iOS 模拟器

真实的 iPhone/iPad 设备

- 通过 Proxyman -> Certificate 菜单 -> Install to iOS -> Physical Device -> Follow the instruction,将证书安装到你的 iPhone/iPad
3. ✅ 重新加载你的 iOS 应用,并在 Proxyman 中查看流量
- WKWebView 的所有流量都会被抓取并显示在 Proxyman 中。
- 适用于任何第三方库发出的 HTTP/HTTPS 请求,例如 fetch、axios、XMLHttpRequest 等。

4. 后续
- 你可以使用 Proxyman 过滤器(Filter)筛选出需要调试的流量。
- 你还可以使用 Proxyman 的 Replay 功能,重放需要调试的流量。
重要的设置提示
请将此代理配置保留在调试版本中,不要包含在 App Store 版本中。只有在同一台 Mac 上运行的模拟器才使用 127.0.0.1;真机需要使用 Proxyman 显示的 Mac IP。请在创建 WKWebView 之前应用代理。已有连接可能仍走旧的路由,因此在会话中更改代理后,请重新创建 web view 或其数据存储(data store)。

Noah Tran