如何处理后台网址会话丢失的互联网连接?

时间:2016-02-11 15:07:14

标签: ios swift download background nsurlsession

我有后台下载zip文件:

if let url = NSURL(string: urlstring) 
         {            
            let config = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier((NSUUID().UUIDString))
            let session = NSURLSession(configuration: config, delegate: self, delegateQueue: nil)
            let task = session.downloadTaskWithURL(url)
            session.sessionDescription = filepath
            if let sessionId = session.configuration.identifier
            {
                print("start zip session: " + sessionId)
            }

            task.resume()               
            }
        }

如果你有互联网连接但是如果你在下载应用程序时丢失了它只是等待并且URLSession(会话:NSURLSession,任务:NSURLSessionTask,didCompleteWithError错误:NSError?)将永远不会被调用。 如何处理?
像服务器响应时间的东西

3 个答案:

答案 0 :(得分:1)

这个问题很老,但仍然没有答案,所以这里有一个解决方法。

首先澄清一些

一般情况下,URLSessionConfiguration的{​​{1}}属性可以设置为waitsForConnectivity,其中false会在连接丢失时直接失败。但是,如果URLSessionTask,则true会收到URLSessionTaskDelegate方法的回调。

<强>然而

urlSession(_:taskIsWaitingForConnectivity:)等后台任务始终等待连接并忽略DownloadTask的{​​{1}}属性。他们还不要触发waitsForConnectivity回调,因此没有正式的方法来监听下载任务的连接中断。

解决方法

如果您正在收听下载进度,您会注意到该方法的调用在一秒钟内完成了几次。因此,我们可以得出结论,如果进程回调未被调用超过5秒,则可能存在连接丢弃问题。因此,解决方法是为URLSessionConfiguration委托创建其他属性并存储进度的上次更新。然后使用interval函数定期检查此属性是否未尽快更新。

类似的东西:

urlSession(_:taskIsWaitingForConnectivity:)

非常简单的例子......

答案 1 :(得分:0)

您可以为请求设置超时:

config.timeoutIntervalForRequest = <desired value>
config.timeoutIntervalForResource = <desired value>

文档:

答案 2 :(得分:0)

根据pausing and resuming downloads上的Apple文档:

  

此外,使用后台配置的下载将自动处理恢复操作,因此只有非后台下载才需要手动恢复。

此外,downloading files in the background中指出了忽略waitsForConnectivity的原因:

  

如果您的应用程序在后台运行,则系统可能会在其他过程中执行下载时挂起您的应用程序。

这就是为什么即使您以类似于Dimitar Atanasov的方式构建计时器,一旦应用程序在后台运行也将无法工作,因为它将被暂停。

我已经测试了在后台下载自己时遇到的网络故障,并且系统可以正常运行,因此不需要额外的代码。