0

Wenn ich den folgenden Code ausführen und die App im Hintergrund lassen, wird der Download noch fortgesetzt. Schließlich, wenn der Download abgeschlossen ist, kann ich den richtigen Rückruf erhalten.NSURLSession, nachdem die Daten-Task zum Download-Task konvertiert wurde, kann es nicht im Hintergrund herunterladen

let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(SessionProperties.identifier) 
let backgroundSession = NSURLSession(configuration: configuration, delegate: self.delegate, delegateQueue: nil) 

let url = NSURLRequest(URL: NSURL(string: data[1])!) 
let downloadTask = backgroundSession.downloadTaskWithRequest(url) 
    downloadTask.resume() 

Aber ich habe eine Verpflichtung, das heißt ich, was der Server kehrt zu mir, um zu beurteilen haben, ob es ein json ist, ich den Download nicht tun, so möchte ich zunächst die Antwort-Header bekommen, dann, wenn es zum Download muss, ändern sie die Daten-Task-Aufgabe zum Download, so dass ich tat, wie der folgende Code

let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(SessionProperties.identifier) 
let backgroundSession = NSURLSession(configuration: configuration, delegate: self.delegate, delegateQueue: nil) 

let url = NSURLRequest(URL: NSURL(string: data[1])!) 
//I change the downloadTaskWithRequest to dataTaskWithRequest 
let downloadTask = backgroundSession.dataTaskWithRequest(url) 
downloadTask.resume() 

dann kann ich die Antwort-Header in den Rückruf erhalten, und wenn es Datei herunterladen muss, ich kann die Datenaufgabe zu Download-Aufgabe ändern, wie folgt

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) { 
    if let response = response as? NSHTTPURLResponse { 
     let contentType = response.allHeaderFields["Content-Type"] as! String 
     if contentType == "image/jpeg" { 
      //change the data task to download task 
      completionHandler(.BecomeDownload) 
      return 
     } 
    } 
    completionHandler(.Allow) 

} 

So weit so gut. Wenn ich die App im Vordergrund laufe, ist der Effekt wie ich dachte. Aber nachdem die App im Hintergrund läuft, wird der Download gestoppt. Wenn ich die App öffne, sagt die Konsole "Verbindung zum Hintergrundtransferdienst verloren".

Ich dachte, Apple ist so schlau, er gibt uns viele nützliche Rückrufe, aber jetzt wusste ich nicht, wo ich falsch liege, und ich sehe auch den Quellcode über die AFNetworking und Alamofire, aber ich habe nicht gefunden das Bezugende.

Ich denke auch, dass es eine allgemeine Anforderung ist, aber ich kann keine hilfreichen Informationen im Internet finden, es ist zu merkwürdig.

Also hoffe, Sie können mir helfen, danke eine Milliarde.

+0

Wie ein Mitarbeiter von Apple sagte, ist es ein Fehler von OS. Also habe ich diesen Weg aufgegeben. Die neue Art, wie ich es jetzt mache, besteht darin, eine Download-Aufgabe zu erstellen. Nachdem die Daten heruntergeladen wurden, übertragen Sie die Daten an einen anderen Ort, wenn es sich um einen JSON handelt, um den Antwortheader zu beurteilen. Wenn die Daten ein Bild sind, lesen Sie sie aus der tmp-Datei und führen Sie die verweisende Behandlung durch. – Changwei

Antwort

0

Aktivieren Sie den Hintergrundmodus in Xcode-> Target-> Capabilities-> On Background Mode und wählen Sie die Option Background Fetch.

0

Das Hauptproblem, das ich sehe, ist, dass Sie die completionHandler zweimal aufrufen. Sie müssen bedingter aus Ihrer Content-Type zurück wie so:

if contentType == "image/jpeg" { 
    //change the data task to download task 
    completionHandler(.BecomeDownload) 
    return 
} 

Ansonsten scheint es, dass Sie die Logik richtig verwenden. Ich hoffe, das hilft.

+0

Danke für deine Antwort, es tut mir leid, dass ich den Code mit falscher Logik kopiert habe. Im Gesicht, obwohl ich nur einen Zeilencode schreiben - "completionHandler (.BecomeDownload)" im Callback "didReceiveResponse". Ich habe den gleichen Fehler. Ich habe eine Demo auf GitHub erstellt, wenn es für Sie bequem ist, bitte laden Sie es und starten Sie es, wenn es beginnt zu downloaden, klicken Sie auf Home-Taste, dann öffnen Sie die App erneut, Sie werden den Fehler sehen. https://github.com/tuchangwei/data_task_convert_to_download_task – Changwei

0

Das Problem ist offensichtlich aus Ihrer eigenen Antwort. Es ist kein Fehler, Sie könnten einfach keine Daten-Tasks für Hintergrundübertragungen verwenden, sondern einfach nur Aufgaben herunterladen.

Here ist die richtige vollständige Antwort.

+0

Danke, lesen Sie die Daten aus der TMP-Datei ist eine gute Möglichkeit, zu beurteilen, ob ich eine Mediendatei oder JSON-Daten herunterladen. – Changwei