【发布时间】:2015-09-01 13:20:58
【问题描述】:
当我尝试在网络离线(飞行模式)时使用 NSURLSessionConfiguration defaultSessionConfiguration 和 ephemeralSessionConfiguration 启动基本 NSURLSession 传输时,我当然会立即收到 NSError :
Domain=NSURLErrorDomain Code=-1009 "The Internet连接似乎处于脱机状态。”
但是使用 NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier,NSURLSession 永远不会返回,没有任何响应,没有超时触发,它被卡住了。
iOS 8.x 会发生这种情况。在 iOS 7.x 中,我得到了预期的 NSError。
为什么会这样?有没有办法恢复一些错误?
【问题讨论】:
-
嗯。后台会话的关键特性之一是在远程服务器可访问之前它不会尝试启动连接。是否可以在发起请求之前只检查可达性?
-
是的,当然,我知道我可以使用 Apple 可达性示例代码,在发起请求之前检查可达性。但我不知道后台会话不会在离线时尝试启动连接。顺便说一句,如果我用可达网络启动后台传输,然后我切断网络,会话也会被吸走。如果我再次重新连接到网络,传输会继续。
-
WWDC 2014 What's New in Foundation Networking 讨论了后台会话的这一功能。关于 iOS 7 v iOS 8 中的超时行为,请参阅stackoverflow.com/q/26379449/1271826。
-
@Rob 我认为使用可达性来确定是否应该发送原始请求并不是一个好主意。它已在github 上得到广泛讨论。
-
@utsavdusad - 总的来说,这是正确的:一个支配性的设计原则是,尝试某事并让它失败通常更好,而不是在尝试之前检查它是否可以成功。这就是 README 说明它的作用的原因。但是 OP 的场景不同:后台会话不会触发错误,所以如果你想查看网络是否可用,那么你必须检查。
标签: ios timeout nsurlsession nsurlsessionconfiguration