Meine NSURLSessionDelegate-Methoden werden während eines Hintergrunddownloads nicht aufgerufen

8

Ich versuche einen Download mit NSURLSession einzurichten, der im Hintergrund weiterläuft. Ich habe eine Singleton-Klasse namens DownloadManager , die die NSURLSession erstellt und eine Download-Aufgabe wie folgt startet:

%Vor%

Ich habe die Methoden NSURLSessionDelegate und NSURLSessionDownloadDelegate einschließlich URLSessionDidFinishEventsForBackgroundURLSession: implementiert. Darüber hinaus implementiert mein Anwendungsdelegat application:handleEventsForBackgroundURLSession:completionHandler: .

Wenn ich jedoch meine Anwendung in den Hintergrund verschiebe, indem ich nach dem Start eines Downloads die Home-Taste drücke, hören alle Download-Delegiertenmethoden auf zu brennen und application:handleEventsForBackgroundURLSession:completionHandler: wird nie aufgerufen. Der Download wird fortgesetzt, und wenn ich lange genug auf den Abschluss warte, wird URLSession:downloadTask:didFinishDownloadingToURL: aufgerufen, sobald ich meine App wieder in den Vordergrund bringe. Das bedeutet, dass ich keine Nachbearbeitung im Hintergrund durchführen kann (z. B. Speichern in Core-Daten, Starten eines neuen Downloads, usw.).

Ich habe versucht, den Hintergrundmodus "Background fetch" zu meinem plist hinzuzufügen, falls dies erforderlich war, und ich habe versucht, meinen Bezeichner zu ändern, um die NSURLSessionConfiguration Hintergrundkonfiguration zu erstellen, wie in diese Antwort . Habe ich bei der Einrichtung einen Fehler gemacht, oder soll ich Download-Delegate-Ereignisse im Hintergrund nicht verarbeiten können?

    
jjoelson 27.03.2014, 20:07
quelle

1 Antwort

8

Sie können die Download-Delegiertenereignisse nicht aufrufen, während die einzelnen Downloads im Hintergrund enden, sondern erst nach dem Neustart der App. z. B. wenn alle Downloads erfolgreich beendet wurden (wenn handleEventsForBackgroundURLSession aufgerufen wird) oder wenn Sie die App manuell neu starten.

Warum Sie handleEventsForBackgroundURLSession called nicht sehen können, kann ich nur an einige (zugegebenermaßen unwahrscheinliche) Möglichkeiten denken:

  1. Stellen Sie sicher, dass die Signatur von handleEventsForBackgroundURLSession in Ihrem App-Delegaten absolut korrekt ist (Großschreibung, Rechtschreibung usw.). Ein geringfügiger Tippfehler wird keine Warnung erzeugen, führt aber dazu, dass er nicht aufgerufen wird. So sollte es sein:

    %Vor%
  2. Sind Sie sicher, dass all Ihrer Hintergrund-Downloads fertig sind? Wenn einer von ihnen aus irgendeinem Grund hängen bleibt oder ausfällt, verhindert das, dass die Beendigung der Hintergrundsitzung ausgelöst wird, und weil die Delegate-Methode nur aufgerufen wird, wenn alles erledigt ist, bedeutet dies, dass Ihre App nicht aktiviert wird. Ich empfehle, sorgfältig zu prüfen, ob alle Downloads abgeschlossen sind.

  3. Haben Sie die Konsole des Geräts überprüft? (Sie können dies sehen, wenn Sie zum Abschnitt "Geräte" des Xcode "Organizer" gehen.) Manchmal gibt es interessante diagnostische Fehlermeldungen, die der Hintergrund-Daemon für Sie protokolliert. Überprüfen Sie das, wenn Sie es nicht bereits getan haben. Viele interessante Sachen dort.

  4. Wenn Sie die App manuell über SpringBoard beenden (doppelklicken Sie auf die physische Home-Taste, halten Sie das App-Icon gedrückt, bis Sie wackeln, klicken Sie auf das rote "x"), damit die Hintergrund-Download-Aufgaben nicht ausgeführt werden Benachrichtigung, dass alle Downloads abgeschlossen sind. Stellen Sie sicher, dass Sie URLSession:task:didCompleteWithError: implementieren, damit Sie diesen Fehler (und alle anderen) sehen können.

    Wenn ich jedoch die App programmgesteuert abstürzen lasse, wie im WWDC-2013-Video gezeigt Was ist neu in Foundation Networking , oder wenn es vom System beendet wird, werden die Hintergrund-Downloads korrekt beendet und die App-Delegate-Methode wird korrekt aufgerufen.

Nur ein paar Ideen zu beachten.

    
Rob 28.03.2014, 03:30
quelle