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.
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