在我的应用程序中,我从服务器获取的数据非常繁重,并且以单个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秒后我仍收到请求超时。 如何增加等待时间,以免请求超时?
答案 0 :(得分:1)
答案简短?您不能,也不应尝试。
当iOS设备通过与服务器的开放连接来等待数据时,其网络硬件(Wi-Fi或蜂窝网络)将使用宝贵的电池供电。因此,在等待数据到达时,可以保持硬件处于高温状态的时间是有限制的。
在您的情况下,服务器甚至没有发送一个字节的数据超过一整分钟的时间。期望HTTP / HTTPS请求在如此长的不活动时间内保持活动状态是不合理的。
此外,在蜂窝连接上,随着连接持续时间的增加,实际接收数据的几率接近零,因为您可以切换到其他塔,从3G切换到LTE,反之亦然,经历一段时间的大量数据包丢失即使造成电池电量的浪费和共享蜂窝塔带宽的巨大浪费,仍然对于保持蜂窝电话也不是特别实用。链接在不传递任何数据的情况下运行。
因此,如果您的服务器真的在60秒钟内没有发送任何字节的数据,那么您需要完全重新考虑您的处理方式,并将请求分为两个调用:
发出第一个请求,然后定期发出第二个请求(例如每分钟一次),直到它真正返回数据为止。
别忘了添加某种服务器端脚本来清除在一段时间(一天,一周,等等)之后未声明的任何生成数据,这样它就不会堆积永远。
如果您不希望服务器在这么长的时间内不发送任何数据,那么您应该花一些时间来找出服务器端的问题。