如何在 Xcode 调试导航选项卡中启用网络调试

Posted

技术标签:

【中文标题】如何在 Xcode 调试导航选项卡中启用网络调试【英文标题】:How to enable network debugging in Xcode debug navigation tab 【发布时间】:2020-01-29 13:09:01 【问题描述】:

我正在执行网络操作,但调试导航器没有为网络显示任何内容。代码很简单,可以按预期工作 例如,这个简单的代码下载了一个 300 mb 的文件。大约需要 2-3 分钟,但网络仍保持在 zero KB/s

let urlString = "https://...."

let url = URL(string: urlString)
let dt = URLSession.shared.downloadTask(with: url!)  (url2, response, error) in
  print("completed with \(url2)")

dt.resume()

按预期收到此消息:

completed with Optional(file:///var/folders/5d/mc_q976d5h94zl38kr1zc4ym0000gn/T/CFNetworkDownload_jUr0fl.tmp)

磁盘调试工作正常并按预期显示下载的文件大小

【问题讨论】:

你知道怎么解决吗? 【参考方案1】:

简而言之,即使从 Xcode 12.5.1 和 Xcode 13(beta 2)开始,我发现 Xcode 中报告的网络活动也不可靠。

几个观察:

    我收到不一致的结果。

    例如,这里是一个动画 gif,显示下载进度:

    有趣的是,在下载过程中,“总数”会在下载过程中重置。

    在 Instruments 中(使用 os_signpost 和“兴趣点”来确定下载开始和完成的确切位置),我可以看到下载,但进度是零星的:

    就个人而言,为了监控网络活动,我发现外部工具,例如Charles Proxy 或Wireshark,更可靠:

    这是对网络接口本身的监控,从等式中消除了 Xcode。

    (顺便说一句,在与自定义 Web 服务集成时,这些工具非常宝贵,因为您可以看到原始请求和响应,这使得调试网络代码变得更加容易。)

    有趣的是,当我在 macOS 上通过 Charles 路由我的 iPhone 网络活动时,Xcode 网络活动结果突然正确:

    还有:

    但是当我停止通过 Charles 路由网络活动时,我得到了上面的原始行为。

    如果您没有看到网络活动,请确保您的网络请求正在实际执行。仅仅因为您收到响应并不意味着它通过网络获取它:URLSession 将透明地使用URLCache,如果可以的话,从缓存中检索资产。

    要重置应用缓存,您可以从设备中删除应用并重新安装(从而删除任何缓存的响应),或者仅出于诊断目的,您可以考虑以编程方式暂时关闭缓存:

    let url = URL(string: urlString)!
    var request = URLRequest(url: url)
    request.cachePolicy = .reloadIgnoringLocalAndRemoteCacheData
    
    let task = URLSession.shared.downloadTask(with: request)  location, response, error in
        ...
    
    task.resume()
    

【讨论】:

以上是关于如何在 Xcode 调试导航选项卡中启用网络调试的主要内容,如果未能解决你的问题,请参考以下文章

在 Chrome 自定义选项卡中从 WebView 打开链接时获取 ANR 对话框。我该如何调试?

将 iOS 设备添加到 Xcode 的设备中,无需电缆即可进行调试/构建

如何在 Chrome 开发者工具的网络选项卡中默认启用“保留日志”?

如何在 React Native 中查看网络请求(用于调试)?

在 Mac 上默认启用 Chrome 上的远程调试?

iOS调试Webview