
1. 为什么我需要一个专门的网络调试工具做客户端开发或者接口联调久了你一定会遇到这样的场景App 里某个页面数据不对前端说是后端返回有问题后端说我这边接口测试没问题。两边都是好人但问题就是找不到。还有调试 WebView 里的 H5 页面、分析某个 SDK 到底往服务器发了什么、排查弱网环境下请求超时……这些破事没有一个好用的网络调试工具有时候真的寸步难行。Proxyman 就是干这个的。它是一个运行在 macOS 上的原生网络调试代理工具核心能力是抓取和分析 HTTP/HTTPS 流量。跟其他同类工具相比它最让我喜欢的地方是 UI 做得非常现代操作流畅不卡顿而且针对日常排查场景做了大量顺手的小功能。Premium 版本解锁了更多高级能力比如多设备同时抓包、脚本自定义、Mock 本地数据等配合真实 iOS 设备、安卓模拟器和电脑上的各种进程基本能覆盖日常开发和测试的绝大部分场景。这篇文章我会从实际使用者的角度把 Proxyman 的核心功能、配置姿势、踩过的坑和真实排查案例都过一遍。无论你是刚接触抓包的初级开发还是被线上问题按在地上摩擦过的老手应该都能从中找到能直接用的东西。2. 核心原理与功能拆解2.1 HTTPS 解密为什么是抓包的第一关现在线上流量基本全面 HTTPS 化。如果你抓到的请求全是密文那抓包工具基本等于废了。Proxyman 的 HTTPS 解密原理跟所有代理工具类似它会在本机生成一个 CA 根证书你的手机或电脑信任这个证书后代理工具就能对流量做中间人解密。具体流程是Proxyman 拦截到客户端发往服务器的 TLS 握手请求用它自己的证书跟客户端完成 TLS 连接同时代理工具再以客户端身份跟服务器建立另一条 TLS 连接。这样两边都是加密的但中间人握着解密后的明文数据。操作上Proxyman 在 macOS 上装好根证书后需要在钥匙串访问里把证书改为始终信任iOS 真机抓包时下载描述文件后还要到设置-通用-关于本机-证书信任设置里手动开启开关。这一步卡住很多人。证书装完了iOS 的 Safari 能打开 https 网页但 App 里的请求仍然报 SSL 错误大概率就是没到证书信任设置里打开那个开关。如果用的是 iOS 10.3 以上的系统且 App 走的是 NSURLSession还需要检查 App 的 ATSApp Transport Security是否允许本地网络和任意加载。做开发调试时强烈建议在 Info.plist 里加 NSAllowsArbitraryLoads 临时放开限制调试完再删掉。注意跟 Charles 一样Proxyman 解密 HTTPS 需要客户端信任它的 CA 根证书。绝对不要把 Proxyman 的证书安装到生产环境或任何你不完全信任的设备上。这类工具的定位是开发调试不是拿来分析别人的流量的。2.2 界面布局信息密度和易用性的平衡用习惯之后你会发现Proxyman 的界面设计不是随便弄的。左侧是会话列表所有被捕获的请求按域名和标签页组织可以直接搜索域名或 URL。中间是请求概览能看到 METHOD、Host、Path、Status、耗时、大小。右侧是详情面板分为请求、响应、Header、Cookie、Timing 等 Tab。这里我特别想提两个贴心设计。第一个是Pin功能可以把关注的请求钉在列表顶部调试过程中不会被新流量刷走。第二个是Preview视图JSON 响应会格式化高亮还可以折叠展开再也不用复制到别的工具里格式化。对比 Charles 那个锯齿状的树形 UIProxyman 的数据展示明显更符合现代审美的同时信息密度一点不少。2.3 Map Local 和 Map Remote改数据比你想的简单开发联调最烦两个事一是后端接口还没写好前端拿不到真实数据二是线上某个接口返回了异常数据想本地复现但生产环境不能瞎改。Proxyman 的 Map Local本地映射和 Map Remote远程映射就是干这个的。Map Local 让你把某个 URL 的响应替换成本地某个文件的内容。比如接口还没开发完你自己写好一个 mock JSON 文件让 App 直接加载这个文件界面就能先跑起来。Map Remote 则是把请求重定向到另一个服务器地址常用于切换测试环境和预发布环境。两者的入口在 Tools 菜单里按请求的 URL 正则、请求方法、请求体等条件做匹配非常灵活。我自己的习惯是给团队的 mock 数据建一个目录统一维护映射关系每个接口一个 JSON 文件。这样新同学接手前端开发时不需要等后端环境直接拉代码 映射文件就能开工。实测下来团队协作效率提升非常明显。2.4 断点与改写把 App 变成薛定谔的请求断点功能是排查问题时的大杀器。你可以设置一个断点让某个请求或响应被暂停在中间人节点这时可以手动修改请求参数、响应体、Header 等任何字段再放行。对测试同学来说这就是一个无需改代码就能模拟各种边界情况的工具。举个例子之前我排查一个订单状态显示异常的问题。服务端根据订单状态字段返回文案但状态有六种客户端代码只处理了五种。通过断点分别把状态改成 0、1、2、3、4、5 去触发一分钟就定位到了问题。这种场景如果用后端造数据得反复改库效率低到让人崩溃。3. 工具选型Proxyman、Charles、Fiddler怎么选3.1 主流动抓包工具对比优劣势一眼看穿很多人在选抓包工具时会纠结到底用哪个。我自己的经历是早几年用 Charles中间试过 Fiddler后来从某个版本开始主力切到了 Proxyman。三者定位类似但体验差异很大。对比项ProxymanCharlesFiddler Everywhere运行平台macOSiOS/安卓均可抓包macOS、WindowsmacOS、Windows、LinuxUI 现代感优秀SwiftUI 原生偏老式 Java UI跨平台中规中矩HTTPS 解密一键安装根证书需要手动配置相对繁琐性能表现流畅大流量不卡高流量时明显卡顿一般脚本扩展内置 Scripting 功能需要外部工具较弱价格模式免费试用Premium 按年/终身按年授权订阅制iOS 真机调试支持极其友好支持但配置复杂支持流量回放 Mock原生支持完善需要手动配置较弱选型上没有绝对的最好主要看你的使用场景。如果你主力设备是 Windows那 Proxyman 暂时不是你的菜如果是 macOS 并且重度做移动端调试Proxyman 的体验可以说完胜 Charles。而且 Proxyman 对 iOS 真机的配置引导做得相当傻瓜化基本扫描二维码就行这点 Charles 自愧不如。3.2 选 Proxyman 的三个理由以及一个不算缺点的缺点第一个理由是性能。用 Charles 抓大流量日志的时候界面会频繁转菊花切换标签卡顿明显。Proxyman 底层做了很多性能优化在抓取几万条请求的时候依然能保持流畅滚动和筛选。第二个理由是规则同步。Proxyman 提供 iCloud 同步可以在 Mac 和 iPhone 上同步你的 SSL 解密规则和工具设置。换电脑、重装系统后不需要重新配一遍。第三个理由是原生支持 WebSocket 和 HTTP/2。现在很多应用使用 WebSocket 做消息推送抓包工具如果只支持 HTTP/1.1看到的连接信息非常残缺。Proxyman 能完整展示 WebSocket 的帧内容这对排查实时通信问题帮助极大。不算缺点的缺点是它只支持 macOS。如果你偶尔要用 Windows 机器抓包就得另备方案。好在对我这种 Mac 主力机用户这不构成障碍。但如果你是全平台流可能 Charles 或 Fiddler 更合适。4. 移动端抓包配置实操从 iPhone 到安卓模拟器4.1 iPhone 真机抓包完整流程用 Proxyman 抓 iPhone 流量最推荐的方式是使用它内置的 iOS 助手功能。打开 Proxyman 后在菜单栏选择 Certificate - Install Certificate on iOS工具会弹出配置引导第一步在 iOS 上设置代理指向你 Mac 的局域网 IP 和 Proxyman 的监听端口默认 9090第二步用 Safari 打开配置网址下载描述文件第三步到设置里安装描述文件第四步到证书信任设置里开启信任开关。这里有一个容易被坑的点电脑上如果开了防火墙会挡掉来自手机的连接导致代理设置成功但无法上网。排查时先确认 Mac 和手机在同一个 Wi-Fi 下再检查 macOS 防火墙是否允许 Proxyman 接受传入连接。我之前就遇到过手机连不上代理的问题最后发现是公司网络做了 AP 隔离手机和电脑虽然连同一个 Wi-Fi但二层不通换成热点就好了。实操提示如果手机是公司统一管理的设备无法手动安装证书可以尝试企业签名的方式把描述文件装进去或者用模拟器调试。真机加模拟器组合基本覆盖所有调试场景。4.2 安卓侧与模拟器抓包绕过证书固定的思路安卓抓包比 iOS 多一个坑从 Android 7 开始系统默认不信任用户 CA 证书只有 App 主动配置了 networkSecurityConfig 才会信任。这就是为什么很多人安卓抓包时Chrome 能打开网站但 App 里请求全挂。解决办法有两种。第一种是拿到 App 的调试包或在工程里配置 networkSecurityConfig明确信任 Proxyman 的 CA。第二种是使用已 root 的环境把 Proxyman 的 CA 证书移到系统证书目录里。第二种做起来麻烦但对某些第三方 App你没法改代码来说几乎是唯一办法。对于安卓模拟器我通常直接用 Proxyman 推荐的模拟器配置流程。模拟器的代理指向宿主机 IP证书用 adb 安装。实测在常见的模拟器上这套流程跑通率很高。4.3 用 Proxyman 抓本机进程流量的小技巧在 macOS 上Proxyman 还能抓本机进程的网络流量不只是手机。你只需要在 Proxyman 里将系统代理设置为全局模式所有走系统代理的 App 流量都会被捕获。这个功能在排查桌面客户端、命令行工具的时候特别有用。举个例子之前排查一个 Electron 应用的登录问题。界面报网络错误但你不是前端就不知道它内部调了什么接口。开全局代理 过滤进程名一下就看到了它请求了一个带旧 token 的地址。这个信息对快速定位到具体 SDK 或服务非常关键。5. 实操方法用 Proxyman 定位三类常见问题5.1 接口返回数据异常先看原始响应再判断最常见的排查场景是数据对不上。我的排查顺序一般固定为过滤出对应的请求先看 Request 的 URL 和 Header确认有没有带错 token 或环境标识然后看 Response 的原始报文注意查看 HTTP 状态码和 body 内容最后配合 Preview 视图看格式化后的 JSON确认字段是否缺失或类型不对。有一次前端跟我反馈列表页偶尔出现重复数据。我们查了好久缓存和分页逻辑最后用 Proxyman 一抓包才发现同一个分页请求被触发了两次而且参数 offset 没变。原因是一个旧版本的 SDK 没有做请求去重导致服务端返回了同一页数据。前端通过 React 渲染时没有对 key 做严格去重所以看到了重复。如果没抓包这种问题基本靠猜。5.2 证书信任问题装了证书还是 SSL 错误这个是我见过最多的基础但致命的问题。现象是 Proxyman 里能看到请求但响应都是 SSL Handshake Failed。对于 iOS按顺序排查确认描述文件是否安装成功确认设置-通用-关于本机-证书信任设置里是否打开开关确认 App 是否强制校验证书例如用了 AFNetworking 的 pinned certificate确认是否所有请求都失败还是只有个别域名失败。只有个别域名失败时通常是该域名开了 HSTS 或证书绑定需要单独配置 Proxyman 的 SSL Exceptions。对于安卓重点确认代理是否设置到虚拟 Wi-Fi 上以及模拟器 DNS 是否正常。很多模拟器默认 DNS 指向 10.0.2.3但代理配置用 10.0.2.2宿主机两者容易搞混。5.3 弱网和超时问题靠模拟来复现在移动端弱网下的表现是必查项。Proxyman 自带网络条件模拟功能可以设置丢包率、延迟、带宽限制。这个和 Charles 的 Throttle 类似但 Proxyman 的操作更简单选择预设比如 3G、4G、Wi-Fi 弱网或者自定义参数。我当时排查过一个上传图片卡在 30% 的问题。本地网络太好根本复现不出来。开了弱网模拟后发现是客户端在上传中没有处理超时中断的恢复逻辑连接一断就永远停在 30%没有重试也没有错误提示。定位后几天内就把重试和断点续传的逻辑补上了。这种问题如果在真实弱网环境里碰运气可能要花数周。6. 常见问题与排查技巧实录6.1 Proxyman 使用中我踩过的 6 个典型坑这里整理一份速查表都是我自己或身边同事真实遇到过的。现象原因解决方案手机代理设置后无法上网Mac 防火墙拦截了 9090 端口到系统设置-防火墙允许 Proxyman 接受传入连接iOS 抓不到任何请求代理未设置成功或证书未信任按 4.1 的流程重新配置确认 Wi-Fi 是同一局域网安卓 App 全部 SSL 错误Android 7 不信任用户证书使用 networkSecurityConfig 或把证书移到系统证书目录抓到的响应全是乱码传输使用 gzip 但未解压确认 Proxyman 的自动解压选项已开启默认开WebSocket 看不到帧内容未启用 WebSocket 捕获在 Tools 设置里打开 WebSocket 帧记录请求数量太大界面卡顿未设置过滤条件用域名过滤 Pin 功能聚焦关注的接口6.2 证书固定SSL Pinning怎么办不少主流 App 会做证书固定防止中间人攻击。这意味着就算你信任了 Proxyman 的 CAApp 依然拒绝连接。遇到这种情况最直接的方案是要求团队提供 Debug 版本通常是禁用了 pinning 的构建。如果没有 Debug 包又必须抓包在 iOS 上可以尝试 Frida 脚本动态绕过但成本偏高且门槛不低不建议新手一上来就搞这个。实际工作中我通常的协商方式是跟团队约定所有 App 的 Debug 配置里默认关闭证书校验但在 Release 里强制开启。这是一个合理且工程化的折中方案——既能保证开发效率又不破坏线上安全。6.3 脚本扩展让 Proxyman 帮你自动干活Proxyman Premium 的 Scripting 功能很值得多说两句。它允许你编写 JavaScript 脚本在请求/响应经过代理时执行自定义逻辑。比如自动给某个域的请求添加 Authorization 头、自动把线上环境的 URL 改写为预发布地址、或者把响应里的敏感字段脱敏后展示。这个脚本系统不是摆设日常开发效率提升非常明显。我写过一个小脚本当 URL 包含 /api/v1/order 且响应是 JSON 时自动格式化并把金额字段高亮。这样每次调试订单模块完全不用手动翻 JSON 找字段。另一个脚本是给测试同学用的点击某个按钮即可把当前的请求导出为 cURL 命令方便贴到群里让后端复现。经验脚本宁可简单也不要复杂。每次保存脚本后 Proxyman 会热重载不影响当前抓包会话。如果脚本抛异常只影响脚本逻辑不会中断代理转发整体设计比较安全。但第一次写的时候还是建议先在测试环境验证避免生产排查时引入额外变量。7. 结合日常开发场景Proxyman 还能干什么7.1 接口文档与调试的辅助有时候后端接口文档没更新或者文档写得不清楚你想知道某个字段到底会不会返回。用 Proxyman 抓一次真实请求直接看 JSON 路径和实际值比文档靠谱一百倍。个人经验是把关键接口的一次完整请求/响应导出成文件作为团队共享的接口快照。新人入职时直接看这些快照对业务的理解速度比读文档快太多。7.2 排查第三方 SDK 和统计 SDK 的行为App 里集成第三方 SDK 之后总会有一些黑盒行为让你摸不着头脑。比如分享组件到底有没有初始化成功、推送 SDK 的上报周期是多久、日志 SDK 是否在发送敏感数据。用 Proxyman 按域名筛选就能把这些 SDK 的网络行为完整展示出来。之前帮朋友排查过一个崩溃问题看到某个广告 SDK 在 App 启动后短时间内并发请求了 30 多次部分请求在弱网下直接卡住主线程间接导致内存暴增。追踪到具体 SDK 和接口后问题解决起来就容易了。7.3 团队协作分享抓包数据少打无谓的嘴仗Proxyman 支持把请求会话导出为 .pxpl 文件其他同事用 Proxyman 打开后能看到完整的请求、响应、Header、时间线。这个比截图高效得多。前后端扯皮的时候丢一个 .pxpl 文件过去谁对谁错一目了然。我自己组织过一个小规则凡是线上问题反馈必须附带 Proxyman 导出的抓包文件没有抓包文件的反馈一概先让提交者补数据。这种做法实施三个月后反馈质量明显提升很多问题还没到开发手里测试自己看一眼抓包文件就已经定位到了原因。8. 我个人在实际操作中的体会用 Proxyman 这几年最大的感受是工具本身不稀奇但顺手和不顺手之间浪费的时间差距非常悬殊。我最开始从 Charles 迁移过来时其实有几天不太适应它的 UI但把快捷键和布局调成自己熟悉的节奏后就再也回不去了。尤其是大流量不卡顿这一点在抓线上用户反馈的问题时体验差距是决定性的。如果你还在用笨办法调试网络比如让后端打日志、前端加 debugger、测试边点边猜强烈建议先把任意一款代理抓包工具吃透。Proxyman 的 Premium 版本里我最推荐优先尝试的是 Map Local、断点修改和脚本扩展这三个功能一旦用起来工作效率是立竿见影的。最后再分享一个小技巧定期清理 Proxyman 的缓存和旧会话。默认的会话存储会随着时间膨胀影响启动速度和搜索性能。我一般每个月清一次把需要留档的会话导出成文件放到项目文档目录里平时工作界面保持清爽。工具在精不在多但每个工具都需要花点时间维护它才能真正成为你工作流里可靠的一环。