如何监控从iOS模拟器发出的网络调用

157

我想像Firebug一样监视应用程序对我的服务器的调用。 在iOS Simulator或xCode中,我找不到方法来查看这一点。

如果不使用嗅探所有流量的方式,有没有其他方法可以实现? 如果没有,你会推荐哪个工具?

17个回答

107

就我个人而言,我使用Charles来做那种事情。

启用后,它会监控每个网络请求,并显示扩展的请求详细信息,包括支持SSL和各种请求/响应格式,如JSON等...

您还可以将其配置为仅嗅探特定服务器的请求,而不是整个流量。

这是商业软件,但有试用版,并且在我看来它绝对是一个很棒的工具。


2
非常容易使用和配置,正好符合我的需求,谢谢! - Mad Echet
7
如果您的服务器受到TLS保护(应该是这样),它就不容易工作。 - carbocation
我尝试了Charles,但是无法很好地监控出站流量。例如,我无法将我的POST请求格式更改为JSON。 - Jesus Rodriguez

29
一个中间人代理,就像其他答案所建议的那样,如果您只想查看HTTP / HTTPS流量,则是一个很好的解决方案。Burp Suite相当不错。但可能配置起来有点麻烦。我不确定如何让模拟器与其通信。您可能需要将本地Mac上的代理设置为代理服务器实例,以便它拦截,因为模拟器将利用本地Mac的环境。
对于数据包嗅探的最佳解决方案(尽管仅适用于实际 iOS设备,而不是模拟器),我发现使用rvictl是最好的。此博客文章有一个不错的介绍。基本上,您需要执行以下操作:
rvictl -s <iphone-uid-from-xcode-organizer>

然后您可以使用Wireshark(或您喜欢的工具)来嗅探它创建的接口,完成后使用以下命令关闭接口:

rvictl -x <iphone-uid-from-xcode-organizer>

这很方便,因为如果您想抓取模拟器的数据包,您必须浏览发送到本地 Mac 的流量,但是 rvictl 创建了一个虚拟接口,它只显示您插入 USB 端口的 iOS 设备的流量。

1
使用Burp Suite进行加分,而且无需繁琐的配置:https://www.engadget.com/2011/02/21/how-to-inspect-ioss-http-traffic-without-spending-a-dime/。整个过程不到10分钟。 - Vladimir

24

Xcode提供CFNetwork诊断日志记录。苹果文档

要启用它,请将CFNETWORK_DIAGNOSTICS = 3添加到环境变量部分:

输入图像描述

这将显示应用程序的请求及其标头和正文。请注意,必须将OS_ACTIVITY_MODE设置为enable,如所示。否则,控制台上将不会显示任何输出。


5
根据最新文档,不再需要使用OS_ACTIVITY_MODE。文档链接为:https://developer.apple.com/documentation/network/debugging_https_problems_with_cfnetwork_diagnostic_logging。同时需要使用 Mac 上的独立 Console 应用程序,而不是查找 Xcode 的 Debug 控制台中的消息。根据文档:“确保在主 Console 窗口左侧的源列表中选择您的 iOS 设备(如果源列表不可见,请选择“显示源”)。从那里,您可以添加筛选器,例如您的进程、cfnetwork、HTTPProtocol: request等(右键单击行或使用搜索框)。” - qix

23

最近我发现了一个git仓库,可以让这件事变得更容易:git repo

你可以尝试一下。

这是应用程序的截图:enter image description here

祝好。


虽然Bagel很棒也很简单,但我最近注意到它也会显示缓存请求。因此,如果您想知道实际传输的字节数,例如,这并不有用。 - BlackWolf
从网页开发角度来看,这是与浏览器中的网络选项卡最相似、最简单易用的工具。我非常喜欢这个工具。 - MrAn3
在其他人浪费时间之前,需要修复SPM。 - Kirby Todd

21
一个易于在Mac上运行的免费开源代理工具是mitmproxy
该网站包含了Mac二进制文件的链接,以及Github上的源代码。
文档中包含了非常有用的介绍,可用于将证书加载到您的测试设备中以查看HTTPS流量。
虽然不像Charles那样GUI友好,但它可以满足我所有的需求,而且是免费和维护良好的。如果您之前使用过一些命令行工具,那么这很简单明了。
更新:我刚刚在网站上注意到,mitmproxy可作为homebrew安装。这再也不可能更容易了。

你有没有在iOS模拟器上使用mitm取得任何进展?我已经设置好了,但是来自模拟器外部的计算机流量也被捕获了,这并不是最好的选择。在实际设备上使用它是很棒的。我已经用了好几年了。 - atreat
mitmweb是mitmproxy的基于Web的用户界面,允许交互式地检查和修改HTTP流量。与mitmdump不同,它将所有流保留在内存中,这意味着它旨在获取和操作较小的样本。https://mitmproxy.readthedocs.io/en/v2.0.2/mitmweb.html - Raunak

11

Xcode 13 开始,您可以通过 Xcode Instruments -> Network 工具监控网络流量并查看其所有详细信息。但需要在运行 macOS 12+ 的物理设备上运行 iOS 15+。

更多详情请参见 WWDC 2021 视频中的 分析网络流量


2
问题明确要求在使用模拟器时如何监控网络流量,而不是物理设备。 - Crazed'n'Dazed

7

使用Wireshark进行IT技术监控

选择您的接口

enter image description here

添加过滤器并开始抓包

enter image description here


测试

点击任何可触发GET / POST / PUT / DELETE请求的操作或按钮

在wireshark中会列出相应的数据

enter image description here

如果您想了解有关特定数据包的更多详细信息,请选择它并跟随 > HTTP流

enter image description here

希望这能帮助其他人!!


5
如何在请求为 HTTPS(而非 HTTP)时获取更多详细信息? - Tuan Nguyen

7

要监控 https 请求,基本上需要遵循两个广泛的步骤:

如果您只想要一个逐步指南,请跳到结尾处的 TLDR 部分。


  1. 设置一个中间人代理(如Requestly、Charles或HTTP toolkit),并开始将流量发送到它

你可以使用监听系统所有流量的工具,但根据我的经验,你最终会得到太多日志,而不知道如何导航和筛选。

一个更好(也更明显)的方法是只拦截和监控来自iOS模拟器的流量。

你可以通过编辑Xcode项目的模式来实现这一点。

Edit Xcode Schema

并定义两个变量http_proxyhttps_proxy

HTTP proxy environment variables

将这些设置适当地配置以将所有流量发送到您的代理。大多数情况下,它们总是提到其代理正在运行的IP和端口。

如果您的应用程序不使用加密(可能会使用),那么这就是您需要做的全部,此时您还需要处理加密。


  • 使用代理的自签名证书加密请求。然后代理可以解密和读取请求的内容,使您能够正确地调试和监视应用程序的流量。
  • 在iOS模拟器中下载代理工具的自签名根证书。大多数代理工具提供一个http端点,一旦配置了代理,就可以轻松将其添加到模拟器中。 例如:chls.pro/sslproxy.man/sslrequestly.io/ssl

    在iOS上,此证书旨在创建一个自定义配置文件,将代理的证书添加到模拟器的证书链中。

    下载配置文件后,转到设置>通用>设备管理以安装配置文件。

    Install custom profile

    在这里,您将看到已下载配置文件的详细信息以及安装选项。


    完成这一步骤后,您需要启用新添加证书的信任。

    为此,请前往设置 > 关于 > 证书信任设置并启用下载证书的信任。

    Trust custom profile

    现在,您应该能够监视您的HTTP和HTTPS流量,而iOS不会抱怨有任何恶意活动发生。

    免责声明和TLDR:我积极维护Requestly桌面应用程序,这里是一个简短的逐步指南,以通过Requestly设置iOS模拟器监视——https://docs.requestly.io/guides/debugging-https-traffic-in-ios-simulator


    5

    看起来这可能是最近添加的功能。在模拟器上按下 command + control + z 将弹出一个调试菜单。从菜单中,点击 Inspect。Inspect 将呈现选项卡。点击网络选项卡,这将显示所有正在进行的网络请求。


    这很酷,但它会阻挡模拟器底部的渲染,使其无法使用。 扶额 有没有办法移动它? - earthling
    是的,我相信你可以将输出窗口移动到模拟器的顶部。这有时很令人恼火,有时你必须将输出屏幕从模拟器底部移动到顶部,反之亦然。 - bruckerrlb
    2
    请问最近是指什么时间?请提供您的Xcode版本。 - Steve Moretz
    1
    我认为他在提到React Native的网络 - 它只显示由React/JS代码触发的调用,而不是通过网络管道传输的所有内容。 - joe

    3
    如果您有电缆连接和Mac,则有一种简单而强大的方法:
    1. 安装免费的Wireshark,确保它可以捕获设备(您需要在每次计算机重启后执行此操作!):
    2. sudo chmod 644 /dev/bpf*

    3. 现在与WiFi共享您的网络。系统偏好设置>共享>互联网共享。检查您是否具有“共享连接:以太网”并使用:Wi-Fi。您可能还想配置一些WiFi安全性,它不会干扰您的数据监控。
    4. 将手机连接到您新创建的网络。我在这里经常需要尝试几次。如果手机不想连接,请关闭Mac的WiFi,然后重复上述步骤2,并耐心等待。
    5. 使用Wireshark捕获无线接口,它可能是“en1”。过滤所需的IP地址和/或端口。当您找到感兴趣的包时,请选择它,右键单击(上下文菜单)>跟随TCP流,您将看到请求和答案的漂亮文本表示形式。
    最好的是:对于Android来说,完全相同的技巧也适用!

    你能在模拟器上使用这个吗?我手机上还没有安装这个应用。 - Joshua Dance
    @Joshua Dance,如果它进行外部网络请求,您可以在模拟器上使用它。由于它们没有通过“电线”(网络卡)传输,因此无法使用Wireshark跟踪到对本地主机的连接。 - JaakL

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接