在 Instruments 中分析 HTTP 流量
Analyze HTTP traffic in Instruments
2021年6月10日
一句话判断
Instruments 的 HTTP 流量分析工具终于让你不用再在 Charles 代理和 Xcode 控制台之间来回切了——网络请求的时间线、header、body 全在一个视图里。
这场 Session 讲了什么
Session 介绍了 Instruments 中新增的 Network 工具模板,专门用于分析 App 的 HTTP 网络流量。之前分析网络请求要么用代理工具(Charles、Proxyman)拦截流量,要么在代码中加日志。这两种方式都有问题——代理工具改变了网络环境可能影响复现,代码日志需要重新编译。
新的 Instruments Network 模板直接在系统层面捕获所有 HTTP/HTTPS 流量,不需要代理,不需要修改代码。它显示每个请求的完整生命周期:DNS 解析、TCP 连接、TLS 握手、请求发送、等待响应、数据接收。时间线视图让你一眼看到请求的并发情况和阻塞点。
还展示了如何过滤和搜索请求(按域名、状态码、请求方法)、如何查看请求和响应的 header 与 body、以及如何将分析结果导出为 HAR 格式与其他工具共享。
值得深挖的点
请求瀑布图对性能优化的价值
Instruments 的 Network 时间线以瀑布图(Waterfall)的形式展示所有请求。你可以清楚地看到:哪些请求是并行的、哪些是串行的(因为代码中 await 了前一个请求的结果)、哪个请求拖慢了整个页面加载。瀑布图还标注了每个阶段的时间——如果 TLS 握手花了 500ms,你看到的就是”连接建立慢”而不是”接口慢”。这种可视化对网络性能优化来说是质的飞跃。
无代理捕获的准确性
代理工具(Charles 等)通过中间人方式捕获 HTTPS 流量,需要安装自签证书。这改变了 TLS 握手的行为——某些证书固定(Certificate Pinning)的请求直接失败。Instruments 的 Network 工具在操作系统网络栈中捕获流量,不需要代理,不影响 TLS 行为,数据更真实。代价是你不能修改请求和响应(比如 mock 数据),它是一个纯分析工具。
代码片段
使用 Instruments Network 模板
// Instruments > Network 工具模板
// 1. 选择你的 App 作为 target
// 2. 点击 Record 开始录制
// 3. 在 App 中执行网络操作
// 4. 点击 Stop 停止录制
// 时间线视图中可以看到:
// - 每个请求的完整生命周期
// - DNS 解析 -> TCP -> TLS -> 请求 -> 响应
// - 请求的并发和排队情况
// 过滤请求:
// 搜索栏输入域名:api.example.com
// 按状态码过滤:status:404
// 按方法过滤:method:POST
分析请求详情
// 点击某个请求条目后显示详情:
// - Request URL: https://api.example.com/v1/users
// - Method: GET
// - Status Code: 200 OK
// - Request Headers:
// Authorization: Bearer xxx...
// Accept: application/json
// - Response Headers:
// Content-Type: application/json
// Cache-Control: max-age=3600
// - Response Body: (JSON 预览)
// - Timing:
// DNS: 23ms
// TCP: 45ms
// TLS: 78ms
// Wait: 312ms
// Download: 15ms
导出 HAR 格式
// File > Export As... > HAR Format
// 生成标准 HAR (HTTP Archive) 文件
// 可以导入到其他工具(Chrome DevTools、WebPageTest)中分析
// 在终端中用 json 工具解析:
// cat network_trace.har | python3 -m json.tool | less
最佳实践
性能优化: 在每次版本发布前跑一次 Instruments Network 分析。重点关注:请求瀑布图中的串行瓶颈(有没有可以并行的请求被写成了串行)、TLS 握手时间(是否需要启用 TLS 1.3 或 HTTP/3)、DNS 解析时间(是否需要预解析常用域名)。
网络调试: 用 Instruments Network 替代 Charles 做网络问题排查。不需要配置代理和证书,直接录制就能看到所有流量。只在需要修改请求/响应(mock 场景)时才用 Charles。
还有什么值得关注
- Instruments Network 支持按进程过滤,如果你的 App 有多个网络扩展,可以分别查看。
- 支持捕获 WebSocket 流量,能看到每条消息的时间戳和内容。
- 与 Xcode 13 的 Instruments 整体性能改进配合,录制时的性能开销比之前小很多。