使用 Proxyman 拦截和模拟 iPhone 应用的网络请求

发表于

在互联网时代,开发者日益频繁地与网络数据打交道。正如我们依赖 IDE 的调试功能来优化代码一样,网络调试工具已成为我们快速、高效地学习、研究和分析网络数据不可或缺的助手。本文将介绍如何利用 Proxyman 来捕获 iPhone 应用的网络请求信息,并通过提供 Mock 数据来模拟服务器响应,帮助开发者在不依赖真实服务器的情况下进行应用测试与开发。

背景与需求

最近,我在使用一款从 App Store 购买的 iPhone 应用时,偶然发现了一个有趣的现象:当应用接收到特定组合的外部数据时,会触发一种独特的 UI 响应效果。遗憾的是,我当时没能及时截图记录,而在之后的使用中也未能再次遇到这种数据组合。为了重现这一特殊效果,我决定尝试一种更为主动的方法——拦截并修改应用的网络数据(即提供 Mock 数据)。

市面上有不少网络调试代理工具可以实现这一目标,但作为一名活跃在苹果生态中的开发者,我首选了在 macOS 平台上运行更为流畅、与苹果系统集成度更高的 Proxyman。

出于隐私保护考虑,本文中所有与网络数据相关的截图和规则设置均为示意图,与实际情况无关。

安装配置 Proxyman 与证书

Proxyman 简介

Proxyman 是一款现代化的网络调试代理工具(Network Debugging Proxy),专为捕获、分析和修改 HTTP(S) 请求/响应而设计。它支持 macOS、iOS、Windows、Linux、Android 等多种平台,适用于 Web 开发、移动应用调试、API 测试等多种场景。

基础配置

在 macOS 上完成 Proxyman 安装后,它会被自动设置为系统的默认网络代理。如果你平时使用其他代理软件,请在启用 Proxyman 前将它们关闭。为了避免忘记还原设置,建议在 Proxyman 的偏好设置中启用“应用退出时自动关闭代理”选项。

Proxyman setting

为什么要安装证书

大多数网络调试工具(包括 Proxyman)都通过中间人攻击技术(MITM, Man-In-The-Middle Attack)来实现对加密网络数据的拦截和分析。为了建立这种“可信”的中间人身份,我们需要在 Mac 和 iPhone 两端都安装 Proxyman 提供的证书授权(CA)证书。

值得一提的是,Proxyman 也提供了 iPhone 版应用,可以不依赖 macOS 直接在设备上进行网络调试。但考虑到在 Mac 上分析数据更加方便,本文采用 iPhone + Mac 版 Proxyman 的组合方式。

证书安装步骤

在 Proxyman 界面中,点击菜单栏的“Certificate -> Install Certificate on iOS”选项。

proxyman install certificate

如果你尚未在 macOS 本地安装证书,Proxyman 会首先引导你完成 Mac 端证书安装。

proxyman-ios-setup-guide

Proxyman 的安装指导非常清晰直观,按照其步骤操作,可以轻松完成双端证书的安装。完整流程概括如下:

  1. 在 macOS 本地安装 Proxyman 根证书
  2. 在 iPhone 的网络设置中,根据 Proxyman 提供的 IP 地址和端口号配置代理
  3. 通过 iPhone 浏览器访问 https://cert.proxyman.io 下载并安装 iOS 证书
  4. 在 iPhone 系统设置中激活该证书(路径:设置 -> 通用 -> 关于本机 -> 证书信任设置)

注意事项

证书安装过程中需特别注意以下几点:

  • iOS 设备版本需为 iOS 18 或更高版本( 16、17 版本有 Bug )
  • iPhone 与 Mac 必须连接到同一无线网络
  • 需关闭 iPhone 上的其他网络代理(如 VPN 应用)
  • 确保 Proxyman 已启动,且 Mac 上其他代理设置已关闭
  • iPhone 证书必须通过 Proxyman 提供的代理服务访问下载地址
  • 如遇证书无法自动下载的情况,可尝试使用浏览器的隐私浏览模式重新访问

完成 iPhone 端代理设置后(即使尚未安装 iPhone 端证书),即可在 Proxyman 的侧边栏中看到来自该 iPhone 的网络请求记录。这表明基础连接已经建立成功。

proxyman-iphone-list

捕获网络请求

请求识别的挑战

使用 Proxyman 捕获 iPhone 应用的网络请求与监控 Mac 本地请求有一个显著区别:Proxyman 不会按应用程序(Apps)对来自 iPhone 的网络请求进行分类,而是仅提供按域名(Domains)组织的列表。这使得识别特定应用的网络流量变得相对复杂。

与分析模拟器中的应用相比,真实 iPhone 设备上通常会产生更多的背景网络请求。因此,你可能需要多次在 iPhone 上”冷启动”目标应用(完全关闭后重新打开),才能准确识别出该应用对应的网络连接。

proxyman-iphone-list-1

解析加密流量

当成功定位到目标连接后,如果该连接使用了 SSL/TLS 加密(大多数现代应用都会采用),则需要在 Proxyman 的 Response 面板中开启对该特定链接的 HTTPS 解析代理功能。

  • Pro 版本用户可以为任意数量的 SSL 链接开启解析功能
  • Trial 版本用户最多同时只能支持两个 SSL 链接的解析(不过链接地址可以随时更改)

查看解密后的数据

启用 HTTPS 代理后,需要再次冷启动 iPhone 上的目标应用。当应用重新建立网络连接后,你会在 Proxyman 界面中注意到几个变化:

  1. 对应的网络连接条目旁会显示一个”解锁”图标,表示加密已被成功解除
  2. 你将能够查看完整的、解密后的网络数据内容,包括请求和响应的详细信息
  3. 数据内容会显示应用与服务器之间完整的通信内容,便于进一步分析

这一步骤是实现后续数据模拟(Mock)的必要前提,只有正确解析了加密流量,才能进行有效的数据分析和修改。

proxyman-ssl

数据模拟(Mock Data)

什么是 Mock 数据?

Mock 数据是一种网络调试技术,通过精确匹配 iPhone 应用发出的特定网络请求,用本地自定义数据替代服务器的实际响应。这种技术允许开发者在不修改应用源代码的情况下,测试应用对各种数据场景的响应行为。

创建 Mock 响应

Proxyman 提供了直观的界面来设置和管理 Mock 数据。操作步骤如下:

  1. 在 Proxyman 界面中找到目标网络请求
  2. 右键点击该请求,从上下文菜单中选择”Tools -> Map Local”选项
  3. 此时会打开”Map Local Editor”配置面板

proxyman-map-local

Map Local 适用于静态 Mock,即拦截请求并直接返回本地文件。

在配置面板中,你可以:

  • 设置需要映射的 URL 模式(支持正则表达式进行灵活匹配)
  • 指定适用的 HTTP 方法(GET、POST、PUT 等)
  • 自定义返回的数据内容和格式

proxyman-map-local-editor

编辑响应数据

对于 JSON 格式的响应数据,Proxyman 提供了特别便捷的编辑体验:

  • 编辑器会自动加载上次服务器返回的 JSON 数据作为模板
  • 你可以直接修改字段值、添加或删除属性
  • 编辑器支持语法高亮和格式化,减少错误
  • 所有修改后的数据会被保存在本地,便于重复使用

应用与高级功能

完成 Map Local 设置后,当 iPhone 应用发送符合规则的网络请求时,Proxyman 会自动拦截该请求并返回你定制的本地数据,而不是将请求转发到实际服务器。

除了基本的 JSON 数据模拟外,Proxyman 还支持更复杂的数据格式:

  • Protocol Buffers (Protobuf) 映射:配置相应的 Schema 后,Proxyman 可以自动对 Protobuf 数据进行编解码,使开发者能够像处理 JSON 一样轻松地编辑二进制格式的数据
  • 二进制数据:支持替换图片等二进制响应
  • 自定义状态码和头信息:可以模拟各种网络状况和服务器配置

这些强大的数据模拟能力使 Proxyman 成为测试应用在各种边缘情况下行为的理想工具。

总结与体会

除了本文示例的探索第三方应用网络数据外,Proxyman 等网络代理工具在日常开发工作中具有更为广泛的应用价值。它能无缝支持各类物理设备、所有苹果设备模拟器,甚至兼容 Xcode 的实时预览环境。Map Local 功能只是其众多强大特性中的一项,Proxyman 还提供了:

  • 网络断点调试:类似代码断点,适用于动态修改数据,可以临时更改 Header、Body、Status Code
  • 自定义脚本处理:通过脚本批量修改请求或响应
  • 代码自动生成:将网络请求自动转换为多种语言的代码实现
  • 编辑并重发机制:修改请求参数后重新发送,快速测试不同场景

在我的开发实践中,特别喜欢“重发”功能与“代码生成”功能的组合应用。通过反复重发不同的请求,我能够准确理解各个 API 端点的作用;然后利用代码生成功能,将验证过的请求直接转化为可执行代码。借助这一工作流,我已成功将一些原本只能在 iPhone 专有应用上实现的功能移植到了 Mac 平台,极大提升了工作效率。

尽管 Proxyman 功能强大,实际调试过程中开发者仍可能遇到各种挑战。例如,我在上述 Mock 场景中就遇到了一个棘手问题:目标应用使用的并非常见的 JSON 格式,而是采用了更高效但调试难度更大的 FlatBuffer 二进制格式。

幸运的是,通过使用 FlatBuffer 官方的 flatc 编译工具分析数据结构,我最终找到了需要修改的数据位置。尽管过程略显复杂,但成功让 iPhone 应用呈现出了我期望的特殊 UI 效果,验证了网络代理调试方法的有效性。

网络代理工具已成为现代移动应用开发不可或缺的助手。Proxyman 凭借其友好的用户界面和强大的功能集,特别适合苹果平台的开发者使用。无论是分析第三方应用行为、调试自己的网络请求,还是创建测试数据模拟各种场景,它都能提供可靠且高效的解决方案。通过这些工具,不仅能提高我们自己的开发效率,还能帮助我们从其他应用中汲取更多优秀的实践。

"加入我们的 Discord 社区,与超过 2000 名苹果生态的中文开发者一起交流!"

每周精选 Swift 与 SwiftUI 精华!