如何 监控IOS系统上的 HTTP/HTTPS 流量

Xcode 与 Instruments 捆绑在一起,Instruments 是一种帮助测量应用程序指标的工具,如内存使用情况、网络活动和时间配置文件。使用工具分析应用可提供有关应用行为和性能的宝贵见解。仪器适用于所有 Apple 平台,允许在设备上测试应用程序时进行实时分析和检查!

在本教程中,您将学习:

  • 如何在 Xcode 中使用 HTTP 流量工具。
  • 关于仪器中的任务和事务,以及分析网络活动。
  • 如何存档 HTTP 流量跟踪并与其他 Web 开发人员共享。
注意:您需要 Apple 开发者帐户才能在物理设备上运行该应用。

开始

使用本教程顶部或底部的“下载材料”按钮下载初学者项目。

初学者项目是一个基于选项卡的应用程序,名为Shuffle,使用Swift UI构建。随机播放有三个选项卡:

  • 今天:显示每日报价以及随机播放按钮。
  • 浏览:用户可以选择、查看和添加的报价列表。
  • 配置文件:允许用户登录并在登录时显示用户活动。

打开初学者项目。然后在您的设备上构建并运行它。在应用中导航以熟悉 UI。

立即应用屏幕和浏览选项卡
“应用屏幕配置文件”选项卡

在本教程中,你将使用 https://favqs.com/ 和 https://picsum.photos/ 提供的 API。您可以使用这些测试凭据登录到应用程序或注册 https://favqs.com/login 帐户。

用户名: 随机播放用户
密码: 随机播放123$

探索项目。请特别注意 DataProvider.swift。此文件是管理应用中的所有 API 请求和响应的网络帮助程序类。查看数据模型、视图和视图模型以了解实现。

尝试使用该应用程序,您会注意到一些需要解决的问题。工具可以帮助确定潜在的问题。您将在此处使用的工具是 HTTP 流量工具

什么是 HTTP 流量工具?

在其网络分析模板中,Instruments 13 引入了一个新的 HTTP 流量工具,可让您跟踪和检查应用程序中流向的所有 HTTP 流量。

HTTP 流量不仅可以帮助您了解在使用 Web 服务 API 时收到的请求/响应发生了什么,还可以帮助您了解连接发生的情况。通过这种方式,它与其他可用的代理Web调试工具不同,例如Charles ProxyProxyman

HTTP 流量还支持网络调试,而无需在设备上安装任何证书。它甚至可以在强制实施SSL固定或使用VPN时工作,同时以漂亮的格式显示HTTP / s连接的整个请求和响应。

虽然它是一个很棒的工具,但它有局限性。目前,HTTP 流量工具不支持模拟器、模拟请求或响应、注入或修改有效负载。

现在,您已经对该工具有了更好的了解,接下来您将使用它来检查应用程序。

检查应用程序

在设备上测试应用之前,如有必要,请更改捆绑标识符并设置预配配置文件。请按照以下步骤使用工具进行分析:

  1. 将 iOS 设备连接到 Mac。
  2. 打开初学者项目并将运行目标设置为设备。
  3. 从菜单中选择产品 ▸ 配置文件或按命令 I

    选择产品配置文件

  4. 当出现性能分析模板选择对话框时,选择“网络”。

    选择网络

  5. 要开始录制,请按工具栏中的“录制”或按 Command-R

    点按“选择”图标

  6. 在录制过程中,使用该应用程序并访问不同的屏幕。
  7. 若要停止录制,请再次按“录制”。

您可以删除网络连接工具,因为它对于本教程来说是不必要的。

开始录制

注意:如果应用程序已安装在设备上,您还可以通过打开“仪器”并从目标设备和进程列表中选择您的 iOS 设备和应用程序来分析该应用程序。

现在,您可以检查和使用应用程序时收集的数据。该数据包括与会话期间发生的每个网络任务和事务相关的详细信息。

典型的检查会话如下所示:

仪器分析示例

HTTP 流量工具跟踪的时间线中显示所有 HTTP 活动。每个跟踪都特定于一个 URL 会话

A. 选定的工具:HTTP 流量
B. 进程:应用程序
C. 会话:URL 会话 — 共享
D. 域:URL 会话任务 — HTTP 请求域

现在,观察过滤器:

过滤 器

  • 筛选器 1:用于选择是否在跟踪中显示任务或事务。本教程稍后将介绍这些内容。
  • 筛选器 2:具有用于选择 URL 会话任务或 HTTP 事务列表或事务持续时间摘要的选项。
注意:您也可以通过单击文件 ▸ 保存来保存会话以供以后参考。录制的会话将另存为 .trace 文件。

接下来,您将了解 HTTP 流量工具的实际工作原理。

HTTP 流量工具的工作原理

为了与 Web 服务进行通信,请使用更高级别的网络 API,如 URLSession。但是,Instruments依赖于苹果核心框架的较低级别的网络堆栈。因此,当使用任何网络API时,它适用于所有Apple设备和通过应用程序的所有HTTP流量。

任务和事务

任务类似于 URLSessionDataTask 或 URLSessionDownloadTask。它开始于您调用时,并在它结束之前调用相应的完成闭包。resume

事务是指与 Web 服务通信的单个实例。它包括:

  • 建立连接。
  • 执行任何缓存查找。
  • 旋转线程。
  • 发送 HTTP 请求。
  • 等待时阻塞线程。
  • 并接收传入的响应。

换句话说,用最简单的术语来说,事务在您调用任务时开始,并在调用关联的完成块时结束。resume()

事务描述

但是,在某些情况下,一个任务可能有多个事务,例如,当存在重定向或 URL 转发时。

任务描述

现在您已经了解了该工具提供的所有信息,现在是时候分析该应用程序并查看其表现了!

分析和检查应用

首先,将初学者应用配置为新会话并开始录制。在“今天”选项卡中,点击“随机播放”并稍等片刻。然后停止录制会话。

收集数据后,请观察时间线和任务。仪器时间轴将如下所示:

检验步骤 1

【注】使用命令加号命令减号在时间线中放大或缩小。

如上图所示,“今天”选项卡中有两任务。

检查任务以获取当天的报价。它调用 favqs.com Web 服务 API。

检验步骤 2

详细信息区域和工具提示显示与此任务相关的所有重要信息:

  • 终结点和查询(如果有):api/qotd
  • HTTP 版本: 1
  • HTTP 方法: 获取
  • 所用时间/持续时间/>:示例(100 毫秒)
  • 响应 — 状态代码:200
  • 响应哑剧类型:应用程序/json

如您所见,此任务已成功并标记为绿色。完美,不是吗?:]

现在,在“随机播放”下,选择“跟踪显示为 HTTP 事务”。然后,选择详细信息区域中的筛选器选项,并选择“列表: HTTP 事务”以查看事务的详细信息。

过滤器选择

您将在所选交易记录的检查区域中看到请求/响应详细信息。

检查窗格详细信息请求/响应

但是,有一个问题:对picsum.photos的调用显示为已取消,并标记为灰色。不太好,是吗?:[

若要找出问题所在,请选择“列表:URL 会话任务”作为详细信息区域中的筛选器。然后向右滚动以查看详细信息:

  • 错误域
  • 错误代码
  • 本地化的错误描述

在详细信息列表中选择特定任务以进行检查。右侧的检查详细信息显示回溯。

检验步骤 3

【注】如果检查器中未显示函数名称,则可能是符号化存在问题。在这种情况下,请右键单击十六进制地址,然后选择“定位/加载 dSYM”。

在 DataProvider 中打开.swift。现在,您将看到任务开始的位置,这有助于您快速检查可能的问题。getRandomPicture(completion:)

检验步骤 4

幸运的是,在本例中,您将在 中看到发送到任务 dataTaskFetchImage。一定是开发人员无意中添加了一个拼写错误,在尝试获取当天的报价时取消了此任务!.cancelgetQOTD(completion:)

好吧,没有漂亮图片的报价有多有趣?!:] 您将在下一节中修复丢失的图片。

应用代码修复

在 DataProvider.swift中,找到 。这里的目的是取消任何正在进行的任务,以便在触发新报价之前获取报价。getQOTD(completion:)

替换为:dataTaskFetchImage?.cancel

dataTaskFetchQuote?.cancel()

要标识下载任务,请为任务添加 。taskDescription

在 的末尾,在调用之前添加以下行:getQOTD(completion:)dataTaskFetchQuote?.resume()

dataTaskFetchQuote?.taskDescription = "QuoteOfTheDayDownloadTask"

同样,在调用之前,请将此行添加到 :getRandomPicture(completion:)dataTaskFetchImage?.resume

dataTaskFetchImage?.taskDescription = "RandomImageDownloadTask"

系统不解释 。您可以将此值用于您认为合适的任何目的。在这里,它将帮助您在 Instruments 中更好地识别此任务。taskDescription

查看任务用于调试的“仪器”中的说明值

构建并运行。现在,您将看到背景图片已成功加载。耶!

报价加载背景

点按随机播放并观察。

随机播放操作不起作用

请注意,背景图像不断随机排列,但引号保持不变。

但是为什么?模因

回想一下您检查 favqs.com API 任务的上一个会话。

检验步骤 2

注意到什么了吗?

提示:在 HTTP 流量工具>随机播放>共享会话“中,确保选中 favqs.com API 跟踪。从详细信息区域的筛选器选项中,选择“列表: HTTP 事务”。

缓存查找

通知!这告诉您API调用从未转到Web服务,因为已经有可用的缓存响应。缓存的数据在短短几毫秒内立即返回,因此它始终显示相同的报价。罪魁祸首是以下几行:Cache LookupgetQOTD(completion:)

let urlRequest = URLRequest(url: url, cachePolicy: .returnCacheDataElseLoad)

要解决此问题,请将上面的一行替换为:

let urlRequest = URLRequest(
  url: url,
  cachePolicy: .reloadIgnoringLocalAndRemoteCacheData)

通过设置为缓存策略,可以要求 始终通过连接到远程 Web 服务 API 来加载数据。.reloadIgnoringLocalAndRemoteCacheDataURLRequest

构建并运行。啊哈!

随机播放操作工作

再次分析应用并记录“今天”选项卡的会话。现在,您将看到未缓存的响应和任务描述。

随机播放修复检查

耶!

成功儿童模因

任务描述在收到图像之前具有 URL 重定向。因此,它在一个任务中有两个事务!检查详细信息和检查器区域,以获取有关两个交易的响应的更多详细信息。RandomImageDownloadTask

HTTP 重定向

您也可以右键单击任务,然后选择“设置检查范围”和“缩放”以缩放轨迹视图中的所选任务。

缩放至所选任务的提示

接下来,您将在 HTTP 跟踪工具中检查安全 API 及其关联的 Cookie。

检查身份验证 API

分析应用并开始录制。然后,选择“配置文件”选项卡并登录。如果您没有创建自己的用户名和密码,则可以使用以下各项:

用户名: 随机播放用户
密码: 随机播放123$

等待活动列表加载。

用户活动列表

然后,停止录制并检查如下。使用 HTTP 事务过滤器模式查看检查器区域中的请求/响应内容。

身份验证任务检查

当您仔细查看该跟踪时,您将看到 HTTP 方法、API 终结点和响应代码等详细信息。

身份验证任务检查 仔细查看

该轨道还包含显示使用的HTTP版本,身份验证标头以及是否正在发送/接收Cookie的符号。

如果您没有看到用户的任何活动,请导航到应用程序中的“浏览”屏幕。选择报价并在登录后选择书签

公开数据的警告

注意:警告:如您所见,HTTP 流量工具公开了作为请求/响应的一部分发送的所有敏感信息。使用时要小心,以避免任何误用。

生成 HTTP 归档文件

在本教程中,问题出在应用级别。在实际项目中,在使用 Web 服务 API 集成时,API 响应中经常存在问题。HTTP 流量工具允许您将跟踪导出为 HAR 文件,以便与 Web 服务开发人员共享调查的详细信息。HAR 是一种 JSON 格式的存档文件格式,用于记录应用与 Web API 的交互。

在导出之前,请通过从“乐器”菜单中选择“文件>保存”来保存录制文件。

保存后,打开“终端”。转到保存 .trace 文件的目录,然后运行以下命令。

xcrun xctrace export --input <MySavedSession.trace> --har

此代码将 .har 文件保存在当前目录中,您可以轻松共享该文件,因为它不需要 Xcode Instruments 即可打开。

注意:您可以使用 Google Admin Toolbox – HAR Analyzer 查看 HAR 文件。您可以在可下载的材料中找到一个示例 HAR 文件 Shuffle_Sample.har

哈分析仪

这就是本教程的全部内容。

引用

以下是一些有用的资源和教程,可帮助您了解有关此领域的更多信息:

WWDC Video 2021对此主题进行了很好的介绍:

分析仪器中的 HTTP 流量

本教程使用以下 API:

其他 Xcode 工具教程:

请参阅以下教程以了解有关代理调试工具的详细信息:

其他参考资料:

Comments

Popular posts from this blog

Python Receiving and parse JSON Data via UDP protocol

ubus lua client method and event registration code demo/example