2016-02-11 87 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"); 
    } 
} 

很簡單的例子...

相關問題