会话配置超时间隔不能设置为大于60秒

时间:2019-03-12 11:07:39

标签: ios nsurlconnection nsurlrequest nsurlsessiondownloadtask nsurlsessionconfiguration

在我的应用程序中,我从服务器获取的数据非常繁重,并且以单个API中的批量数据的形式出现。 因此,我将超时间隔增加到1800秒。 我的代码是

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.mobiletuts.Singlecast.BackgroundSession"];
        // Session Configuration
        [sessionConfiguration setTimeoutIntervalForRequest:30*60];
        // Initialize Session
        session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil];

NSMutableURLRequest* request = [[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:fdi.downloadSource]] mutableCopy];
    request = [CommonFunctions AddRequestHeaders:request];
    [request setTimeoutInterval:30*60];
    fdi.downloadTask = [self.session dataTaskWithRequest:request];
    [fdi.downloadTask resume];

即使我的会话显示超时1800秒,但60秒后我仍收到请求超时。 如何增加等待时间,以免请求超时?

1 个答案:

答案 0 :(得分:1)

答案简短?您不能,也不应尝试。

当iOS设备通过与服务器的开放连接来等待数据时,其网络硬件(Wi-Fi或蜂窝网络)将使用宝贵的电池供电。因此,在等待数据到达时,可以保持硬件处于高温状态的时间是有限制的。

在您的情况下,服务器甚至没有发送一个字节的数据超过一整分钟的时间。期望HTTP / HTTPS请求在如此长的不活动时间内保持活动状态是不合理的。

此外,在蜂窝连接上,随着连接持续时间的增加,实际接收数据的几率接近零,因为您可以切换到其他塔,从3G切换到LTE,反之亦然,经历一段时间的大量数据包丢失即使造成电池电量的浪费和共享蜂窝塔带宽的巨大浪费,仍然对于保持蜂窝电话也不是特别实用。链接在不传递任何数据的情况下运行。

因此,如果您的服务器真的在60秒钟内没有发送任何字节的数据,那么您需要完全重新考虑您的处理方式,并将请求分为两个调用:

  • 生成数据-告诉服务器开始处理数据,以使其可供您的应用下载。
  • 检索数据-询问服务器数据是否已准备好,如果可以,则检索数据(并有选择地清除数据,或通过单独的请求进行处理)。

发出第一个请求,然后定期发出第二个请求(例如每分钟一次),直到它真正返回数据为止。

别忘了添加某种服务器端脚本来清除在一段时间(一天,一周,等等)之后未声明的任何生成数据,这样它就不会堆积永远。

如果您不希望服务器在这么长的时间内不发送任何数据,那么您应该花一些时间来找出服务器端的问题。