【问题标题】:NSURLSession background transfer timeout not firedNSURLSession 后台传输超时未触发
【发布时间】: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


【解决方案1】:

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

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

我从developer forum 的一位 Apple 员工那里得到了这个答案。另外,我已经通过实施验证了这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多