【问题标题】:How to monitor network calls made from iOS Simulator如何监控从 iOS 模拟器发出的网络调用
【发布时间】:2012-06-23 02:37:34
【问题描述】:

我正在尝试像 Firebug 一样监控从应用程序到我的服务器的调用。 我找不到在 iOS 模拟器或 xCode 中查看的方法。

有没有办法在不嗅探所有流量的情况下做到这一点? 如果没有,你会推荐什么工具?

【问题讨论】:

    标签: xcode networking ios-simulator network-monitoring


    【解决方案1】:

    就我个人而言,我使用 Charles 来处理这类事情。
    启用后,它将监控每个网络请求,显示扩展的请求详细信息,包括对 SSL 和各种请求/响应格式(如 JSON 等)的支持...

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

    它是商业软件,但有试用版,恕我直言,它绝对是一个很棒的工具。

    【讨论】:

    • 非常易于使用和配置,完全符合我的要求,谢谢!
    • 当你的服务器受到 TLS 保护时,它就不容易工作了。
    • 我尝试了 Charles,但无法很好地监控传出流量。例如,我无法将 POST 请求的格式更改为 JSON
    【解决方案2】:

    如其他答案所建议的那样,如果您只想查看 HTTP/HTTPS 流量,那么中间人代理是一个很好的解决方案。 Burp Suite 很不错。不过配置起来可能会很痛苦。我不确定您将如何说服模拟器与之交谈。您可能必须将本地 Mac 上的代理设置为代理服务器实例才能拦截,因为模拟器将使用您本地 Mac 的环境。

    我发现数据包嗅探的最佳解决方案(尽管它仅适用于实际 iOS 设备,而不适用于模拟器)是使用rvictlThis blog post 写得很好。基本上你会这样做:

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

    然后你用 Wireshark(或你最喜欢的工具)嗅探它创建的界面,当你完成后关闭界面:

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

    这很好,因为如果你想对模拟器进行数据包嗅探,你也不得不涉足到本地 Mac 的流量,但是rvictl 创建了一个虚拟接口,只显示来自你的 iOS 设备的流量已插入您的 USB 端口。

    【讨论】:

    【解决方案3】:

    最近我发现了一个git repo,这很容易。

    你可以试试。

    这是一个应用程序的屏幕截图:

    最好的问候。

    【讨论】:

    • 虽然 Bagel 很棒而且很简单,但我最近注意到它还会显示缓存的请求。因此,例如,如果您想知道实际传输的字节数,这是没有帮助的。
    • 来自 Web 开发,这是您在浏览器中找到的最简单和最相似的网络选项卡工具。我真的很喜欢这个工具。
    【解决方案4】:

    在 Mac 上轻松运行的免费开源代理工具是mitmproxy

    该网站包含指向 Mac 二进制文件的链接,以及 Github 上的源代码。

    文档包含一个非常有用的介绍,用于将证书加载到您的测试设备以查看 HTTPS 流量。

    不像 Charles 那样 GUI-tastic,但它可以满足我的一切需求,而且它是免费的,并且可以维护。 好东西,如果您以前使用过一些命令行工具,那么非常简单。

    更新:我刚刚在网站上注意到 mitmproxy 可作为自制软件安装。再简单不过了。

    【讨论】:

    • 你在 iOS 模拟器上使用过 mitm 吗?我已经设置了它,但是来自模拟器之外的计算机的流量也被捕获,这不是最好的。在实际设备上使用它是惊人的。多年来一直这样做。
    • mitmweb 是 mitmproxy 的基于 Web 的用户界面,允许交互式检查和修改 HTTP 流量。与 mitmproxy 一样,它与 mitmdump 的不同之处在于所有流都保存在内存中,这意味着它旨在获取和操作小样本mitmproxy.readthedocs.io/en/v2.0.2/mitmweb.html
    【解决方案5】:

    Xcode 提供 CFNetwork 诊断日志。 Apple doc

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

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

    【讨论】:

    • OS_ACTIVITY_MODE 不再需要根据最新文档:developer.apple.com/documentation/network/…。还需要在你的 Mac 上使用单独的控制台应用程序,而不是在 Xcode 的调试控制台中查找消息。来自文档:“确保从主控制台窗口左侧的源列表中选择您的 iOS 设备(如果源列表不可见,请选择查看 > 显示源)。”从那里您可以添加过滤器,例如您的进程、cfnetwork、HTTPProtocol: request 等(右键单击一行或使用搜索框)
    【解决方案6】:

    Wireshark

    选择你的界面

    添加filter启动capture


    测试

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

    你会在wireshark中看到它

    如果您想了解有关某个特定数据包的更多详细信息,只需选择它并Follow > HTTP Stream

    希望这对其他人有所帮助!

    【讨论】:

    • 如何知道请求的更多细节是 HTTPS(不是 HTTP)?
    【解决方案7】:

    这似乎是最近添加的。在模拟器上点击command+control+z会弹出调试菜单。在该菜单中,单击Inspect。检查将显示选项卡。单击网络选项卡,这将显示正在发出的所有网络请求。

    【讨论】:

    • 这很酷,但它阻塞了模拟器的底部,使其无法使用。 facepalm有什么办法可以移动吗?
    • 是的,我相信您可以将输出窗口移动到模拟器的顶部。这很烦人,有时您必须将输出屏幕从模拟器的底部移动到顶部,反之亦然。
    【解决方案8】:

    如果你有cable连接和Mac,那么有一个简单而强大的方法:

    1. 安装免费的 Wireshark,确保它可以捕获设备(并且您需要在每次计算机重新启动后进行此操作!):

      sudo chmod 644 /dev/bpf*

    2. 现在与 wifi 共享您的网络。系统偏好设置 > 共享 > Internet 共享。检查您是否有“共享来自:以太网的连接”并使用:Wi-Fi。您可能还想配置一些 wifi 安全性,它不会干扰您的数据监控。

    3. 将手机连接到新创建的网络。我在这里经常需要几次尝试。如果手机不想连接,请关闭Mac的wifi,然后重复上面的步骤2并耐心等待。

    4. 启动 Wireshark 使用 Wireshark 捕获您的无线接口,它可能是“en1”。过滤您需要的 IP 地址和/或端口。当您找到一个有趣的包时,选择它,右键单击(上下文菜单)> 关注 TCP 流,您会看到请求和答案的漂亮文本表示。

    什么是最好的:同样的技巧也适用于 Android!

    【讨论】:

    • 你的模拟器能用这个吗?我的手机上还没有这个应用程序。
    • @Joshua Dance 如果它有外部网络请求,您可以将它与模拟器一起使用。无法使用wireshark 跟踪到本地主机的连接,因为它们没有通过“电线”(网卡)
    【解决方案9】:

    【讨论】:

    【解决方案10】:

    Xcode 13 开始,您可以使用 Xcode Instruments -> Network instrument 来监控所有网络流量及其所有详细信息。你需要一台运行 iOS 15+ 的物理设备

    更多详情请参阅 WWDC 2021 视频中的 Analyze Network Traffic

    【讨论】:

      【解决方案11】:
      1. 安装 WireShark
      2. 从 xcode 网络监视器获取 ip 地址
      3. 听wifi接口
      4. 在 WireShark 中设置过滤器 ip.addr == 192.168.1.122

      【讨论】:

        【解决方案12】:

        您也可以使用这个open source library called Wormholy(由我制作)。

        您只需将它集成到您​​的项目中(无需代码),就是这样,您将能够监控您应用的所有 API 请求,也可以在真实设备上。

        而且您不需要像 Charles 那样管理证书。这一切都靠魔法!

        【讨论】:

        • 看起来真不错!我尝试安装它,但我没有看到它只跟踪来自 NSURLSession 的流量
        【解决方案13】:

        FLEX 是监控 iOS 应用程序网络流量的绝佳工具。

        单击上面屏幕截图中列出的任何请求时,我将被重定向到另一个屏幕,在该屏幕上我可以看到有关该请求的更多详细信息。

        但是,我有一个用例,我正在开发的应用程序会将用户重定向到 Safari。我也想监控 ​​Safari 中的网络流量,但 FLEX 只能监控来自您的 iOS 应用程序的流量,而不是来自任何其他应用程序的流量(在撰写此答案时)。

        然后我切换到Proxyman 来监控来自 iOS 模拟器的网络流量。

        • 它有一套明确的说明,说明如何使用iOS simulatorsAndroid emulators 进行设置。
        • 它有一个简单、直观的用户界面,使用起来很容易。

        【讨论】:

          【解决方案14】:

          如果您习惯了 chrome 检查器工具,一个很好的解决方案是 Pony 调试器:https://github.com/square/PonyDebugger

          设置起来有点麻烦,但是一旦设置好就可以了。请务必使用 Safari 而不是 Chrome 来使用它。

          【讨论】:

            【解决方案15】:

            我使用 netfox。它非常易于使用和集成。您可以在模拟器和设备上使用它。它显示了所有的请求和响应。它支持 JSON、XML、HTML、图像和其他类型的响应。您可以通过 IOS 默认共享格式(Gmail、WhatsApp、电子邮件、slack、短信等)共享请求、响应和完整日志

            您可以在 GitHub 上查看:https://github.com/kasketis/netfox

            Netfox 可以快速查看您的 iOS 或 OSX 应用程序执行的所有已执行网络请求。它抓取所有请求 - 当然是您的请求,来自 3rd 方库(例如 AFNetworking、Alamofire 或其他)、UIWebViews 等的请求

            【讨论】:

              【解决方案16】:

              您可以尝试使用https://github.com/BugBlock/BugBlock-iOS 这是我创建的一个小工具,所以您需要的一切是:

              import BugBlock
              

              然后

              var config = BBConfiguration()
              config.consoleLoggingEnabled = false
              config.serverLoggingEnabled = true
              config.crashReportingEnabled = true
              BBLog.start(appId: "SDK key", configuration: config)
              

              并设置网络拦截器

              let conf = URLSessionConfiguration.default
              BBLog.networkLogging(with: conf)
              let session = URLSession(configuration: conf)
              

              然后在您的请求中使用session。 希望能帮助您捕获日志。

              【讨论】:

                猜你喜欢
                • 2011-01-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-07-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-07-02
                相关资源
                最近更新 更多