2016-11-08 71 views
1

我的iOS应用使用NSURLSessionConfiguration,NSURLSession,NSURLSessionDownloadTask等下载我们的服务器从数据库中即时产生的xml文件。一切工作正常与下载,直到我尝试从一个特定的帐户下载更大的文件。我们的服务器在为此帐户提供xml之前必须做很多工作。换句话说,在服务器实际吐出所请求的xml之前,会有一些重大的等待。对于这个最大的帐户,即使服务器成功处理数据并将其发送到客户端,iOS客户端也不会收到数据。为什么我的NSURLSessionDownloadTask下载无法到达我的客户端?

测试时,我们发现了一些奇特:

  1. 我们不能下载相同的XML任何Safari浏览器(台式机或iOS)
  2. 我们可以下载使用Chrome的XML在桌面上
  3. 我们可以使用命令行
  4. 在我们的iOS应用上的卷曲下载XML,它不能下载的设备上或在模拟器中XML

我启动了timeoutIntervalForRequest和timeoutIntervalForResource。它本身不是“超时”的。但是肯定的是,在Apple的网络堆栈中似乎不允许服务器长时间等待XML生成。为什么Chrome和curl没有问题,但Safari和我的iOS代码呢?所以,我对这里发生的事情感到有些不知所措。

这是传统的服务器代码,将来会更改为JSON和更快的类,所以我不需要任何“更改服务器代码”的答案。

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

+0

我也试过AFNetworking和卷曲,他们都在项目中失败。但是我可以在终端上运行相同的卷曲并且它可以工作。 – Erick

回答

2

有两个超时你会打;第一个是在特定时间段内没有数据时。另一个是在请求未在特定时间段内完成的情况。这两者都需要足够高。我的猜测是,服务器甚至没有在第一次超时时间内发送状态码,导致NSURL堆栈认为服务器已经死机。

即使您可以调整参数以减少问题,但很有可能唯一真正的答案是“更换服务器”,只是因为非零的机会(特别是在蜂窝连接中)网络连接将会随机下降。

来解决,这将是写一个小包装脚本,不带参数的最简单方法:

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

或用UUID参数:

  • 可以确保UUID是没有任何特殊字符的正确UUID。
  • 检查在特定目录中是否存在具有该UUID的文件,并验证文件是否完整。
  • 如果文件不完整,则提供接收的字节数和预期的总字节数(或者只是表示“未就绪”)。
  • 否则,返回文件并立即删除它。

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

然后,在那时,你的应用程序可以只是要求数据并取回UUID。然后,它可以定期询问服务器是否有数据,并且它会立即回复“这是数据”或“不是”。

+0

有趣的回复,谢谢! 是的,我有两个超时值设置天空高。 – Erick

相关问题