当涉及到缓慢的后端和使用后台配置下载数据时,我遇到了问题。
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfiguration:identifier];
_backgroundSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
NSURLSessionDownloadTask *downloadTask = [_backgroundSession downloadTaskWithURL:URL];
[downloadTask resume];
如果连接已建立,但发送回数据的时间超过 60 秒,则会发生超时。没事儿。然而,我经历的行为是我没有收到错误。 Session 只是发出一个新的请求。 “再给我数据”。我不知道这种情况发生在哪里。据我所知,不在我的代码中,也没有调用委托方法。我只能访问服务器日志。服务器大约需要 68 秒才能发回数据,但应用程序会忽略它,因为它正在等待新请求。
一种解决方案是增加超时值。但我不喜欢它,它只适用于 iOS 7。不适用于 iOS 8。
sessionConfig.timeoutIntervalForRequest = 10 * 60.0;
有人对此有任何见解吗?
我找到了这个关于后台会话超时问题的链接 https://stackoverflow.com/questions/20505858/nsurlsessionconfiguration-timeoutintervalforrequest-doesnt-seem-to-work-with-th这里在 stackoverflow 上。已经 10 个月了,但还没有解决方案,只有人们同意。
从iOS8开始,后台模式下的NSUrlSession如果服务器没有响应就不会调用这个委托方法。-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
下载/上传无限期保持空闲状态。当服务器没有响应时,在 iOS7 上调用此委托会出现错误。
一般来说,如果线路出现问题,NSURLSession 后台会话不会导致任务失败。相反,它会继续寻找运行请求的好时机并在那时重试。这将持续到资源超时到期(即用于创建会话的 NSURLSessionConfiguration 对象中的 timeoutIntervalForResource 属性的值)。该值当前的默认值为一周!换句话说,iOS7中超时失败的行为是不正确的。在后台会话的上下文中,更有趣的是不要因为网络问题而立即失败。所以从iOS8开始,NSURLSession任务即使遇到超时和网络丢失也会继续。但是,它会继续,直到达到 timeoutIntervalForResource。
所以基本上 timeoutIntervalForRequest 在后台会话中不起作用,但 timeoutIntervalForResource 可以。
Source: 苹果论坛 https://forums.developer.apple.com/thread/22690
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)