2016-02-11 49 views
2

我已经后台下载的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? )不会被称为从不。 如何处理?
喜欢的东西时从服务器响应

回答

0

您可以为您的要求设置超时:

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

文档:

+0

但如果我会下载一些大就会失败。下载时间取决于文件大小和互联网的速度 –

+0

嗯,我想知道为什么当你失去连接时你没有得到'NSURLErrorNetworkConnectionLost'? –

+0

我加 func URLSession(session:NSURLSession,task:NSURLSessionTask,didCompleteWithError error:NSError?) 和 func URLSession(session:NSURLSession,didBecomeInvalidWithError error:NSError?) but。当我失去联系时,他们不会被叫到 –

0

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

一些澄清第一

一般有一个叫waitsForConnectivityURLSessionConfiguration一个属性,它可以设置为false其中URLSessionTask随后将直接连接丢失失败。但是,如果true,然后URLSessionTaskDelegate将收到urlSession(_:taskIsWaitingForConnectivity:)方法的回调。

然而

后台任务,例如DownloadTask总是等待连接,而忽略的URLSessionConfigurationwaitsForConnectivity财产。他们也不要触发urlSession(_:taskIsWaitingForConnectivity:)回调,所以没有官方的方式来监听下载任务的连接丢失。

解决方法

如果你聆听,你会发现,在方法的调用是在第二完成几次下载进度。因此,我们可以得出结论,如果进度回调未超过5秒钟,则可能会出现连接丢失问题。因此,解决方法是向URLSessionDownloadDelegate委托人提供其他财产,并存储最新的进度更新。然后有间隔功能来定期检查这个属性是否很快没有更新。

喜欢的东西:

class Downloader: NSObject, URLSessionTaskDelegate, URLSessionDownloadDelegate { 

     var lastUpdate: Date; 
     var downloadTask: URLSessionDownloadTask?; 

     public var session : URLSession { 
      get { 
       let config = URLSessionConfiguration.background(
       withIdentifier: "\(Bundle.main.bundleIdentifier!).downloader"); 
       config.isDiscretionary = true; 

       return URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue()); 
      } 
     } 

     override init() { 
      self.lastUpdate = Date(); 
      super.init(); 
     } 

     func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { 
      // Handle download completition 
      // ... 
     } 

     func urlSession(
      _ session: URLSession, 
      downloadTask: URLSessionDownloadTask, 
      didWriteData bytesWritten: Int64, 
      totalBytesWritten writ: Int64, 
      totalBytesExpectedToWrite exp: Int64) 
     { 
      let progress = 100 * writ/exp; 
      // Do something with the progress 
      // ... 

      self.lastUpdate = Date(); 
     } 
    } 

    var downloader = Downloader(); 
    let url = "http://..."; 
    var request = URLRequest(url: URL(string: url)!); 
    currentWorker.downloadTask = downloader.session.downloadTask(with: request); 
    currentWorker.downloadTask!.resume(); 

    // Schedule timer for every 5 secs 
    var timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "CheckInternetDrop", userInfo: nil, repeats: true); 

func CheckInternetDrop(){ 
    let interval = Date().timeIntervalSinceDate(downloader.lastUpdate); 
    if (interval > 5) { 
     print("connection dropped"); 
    } 
} 

很简单的例子...

相关问题