1

当我尝试在网络离线(飞行模式)时启动基本 NSURLSession 传输时,使用 NSURLSessionConfiguration defaultSessionConfiguration 和 ephemeralSessionConfiguration,我当然会立即收到 NSError :
Domain=NSURLErrorDomain Code=-1009 “Internet 连接似乎离线。 "
但是使用 NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier,NSURLSession 永远不会返回,没有任何响应,没有超时触发,它被卡住了。
这发生在 iOS 8.x 上。在 iOS 7.x 中,我得到了预期的 NSError。
为什么 ?有没有办法让一些错误回来?

4

1 回答 1

3

一般来说,如果网络上出现问题,NSURLSession 后台会话不会使任务失败。相反,它会继续寻找运行请求的好时机并在那时重试。这种情况一直持续到资源超时到期(即,用于创建会话的 NSURLSessionConfiguration 对象中的 timeoutIntervalForResource 属性的值)。该值的当前默认值为一周!换句话说,iOS7 中超时失败的行为是不正确的。在后台会话的上下文中,不因为网络问题而立即失败更有趣。所以从 iOS8 开始,NSURLSession 任务即使遇到超时和网络丢失也会继续。但是,它会一直持续到达到 timeoutIntervalForResource 为止。

所以基本上 timeoutIntervalForRequest 不会在后台会话中工作,但 timeoutIntervalForResource 会。

我从开发者论坛上的一位 Apple 员工那里得到了这个答案。此外,我已经通过实施验证了这一点。

于 2016-03-11T14:15:31.517 回答