gpt4 book ai didi

ios - 为什么我的 NSURLSessionDownloadTask 下载无法到达我的客户端?

转载 作者:行者123 更新时间:2023-12-01 19:59:44 25 4
gpt4 key购买 nike

我的 iOS 应用程序使用 NSURLSessionConfiguration、NSURLSession、NSURLSessionDownloadTask 等来下载我们的服务器从数据库中动态生成的 xml 文件。下载一切正常,直到我尝试从一个特定帐户下载更大的文件。我们的服务器必须做很多工作才能为该帐户提供 xml。换句话说,在服务器实际吐出所请求的 xml 之前,有一个相当长的等待时间。对于这个最大的帐户,iOS 客户端永远不会收到数据,即使服务器成功处理了数据并报告将其发送给客户端。

在测试时,我们注意到一些奇怪的东西:

  • 我们无法在任何 Safari 浏览器(桌面或 iOS)中下载相同的 XML
  • 我们可以在桌面上使用 Chrome 下载 XML
  • 我们可以在命令行
  • 上使用 curl 下载 XML
  • 在我们的 iOS 应用程序中,无法在设备或模拟器中下载 XML

  • 我同时调高了 timeoutIntervalForRequest 和 timeoutIntervalForResource。它本身并不是“超时”。但是,Apple 的网络堆栈中的某些东西似乎不允许长时间等待服务器生成 XML。为什么 Chrome 和 curl 没有问题,但 Safari 和我的 iOS 代码有问题?所以,我对这里发生的事情有些茫然。

    这是遗留服务器代码,将来会更改为 JSON 和更快的类,因此我不需要任何“更改您的服务器代码”答案。

    对我有什么想法吗?提前致谢。

    最佳答案

    您会遇到两次超时;第一个是在特定时间段内没有数据时出现的。当请求在特定时间段内未完成时,另一个出现。这两个都需要足够高。我的猜测是服务器甚至没有在第一次超时内发回状态代码,这导致 NSURL 堆栈假定服务器已死。

    即使您可以调整参数以减少问题,也很有可能唯一真正的答案是“更改服务器”,因为(特别是在蜂窝连接上)网络连接随机断开的可能性非零。

    解决这个问题的最简单方法是编写一个不带参数的小型包装脚本:

  • 立即返回资源的唯一标识符 (UUID)。
  • 生成一个异步 curl 作业(在服务器上)以从服务器请求资源并将其写入文件,该 UUID 作为名称
  • 将 libcurl 提供的预期文件长度存储在 My-UUID-Goes-Here.meta 中或类似的。
  • 如果出现任何问题,则删除文件。

  • 或使用 UUID 参数:
  • 确保 UUID 是没有任何特殊字符的正确 UUID。
  • 检查特定目录中是否存在具有该 UUID 的文件,并验证该文件是否完整。
  • 如果文件不完整,则提供接收的字节数和预期的总字节数(或只是说“未准备好”)。
  • 否则,返回文件并立即将其删除。

  • 它可能是十行代码——二十行——再加上一个两行的 cron 脚本来清理任何超过一天的文件。

    然后,您的应用程序可以只请求数据并取回 UUID。然后,它可以定期询问服务器是否有数据,它会立即回复说“这是数据”或“不,还没有”。

    关于ios - 为什么我的 NSURLSessionDownloadTask 下载无法到达我的客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40478139/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com