Ich hatte ein sehr ähnliches Problem, wo die Hintergrundaufgabe gestartet würde, aber dann scheint zu pausieren. Die Aufgabe wäre dann abgeschlossen, wenn die Anwendung wieder in den Vordergrund rückt.
prüfte ich, dass dies der Fall war, durch die Ausgabe von -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
Anmeldung
Ich fand, dass die Art und Weise, um dieses Problem zu bekommen, ist zu tun, wie Sie speichern, verarbeiten und Ihren Abschluss-Handler auszuführen.
In meinem Fall beginnt der Prozess mit
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
[self.fmStore performBackgroundRefresh:^(UIBackgroundFetchResult result) {
//Set application badge if new data is available
if (result==UIBackgroundFetchResultNewData) [UIApplication sharedApplication].applicationIconBadgeNumber++;
completionHandler(result);
}];
}
, wo eine Remote-Benachrichtigung des Download-Prozess beginnt.
Die Methode, die den Download gibt einen Wert abhängig von der Verfügbarkeit neuer Daten
-(void)performBackgroundRefresh:(void (^)(UIBackgroundFetchResult))completion{
if(newData) completion(UIBackgroundFetchResultNewData);
else completion(UIBackgroundFetchResultNoData);
}
An dieser Stelle sei auf die ApplicationDelegate kehrt zurück schafft, wo der Abschluss-Handler
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{
//Store completion handler for background session
self.sessionCompletionHandler=completionHandler;
}
Schließlich gespeichert wird dieser Codeabschnitt ausgeführt, der den Beendigungshandler aufruft und die entsprechenden Benachrichtigungen erstellt
Dieser Prozess hin und her passiert in meinem Fall, da die NSURLSession in einem Objekt existiert, das eine Eigenschaft von ApplicationDelegate ist. Wenn Sie NSURLSession als eine Eigenschaft von ApplicationDelegate selbst implementieren, wird der gesamte Code in derselben Datei vorhanden sein.
Hoffe, dass dies hilft, aber wenn Sie weitere Informationen benötigen, sehen Sie bitte diese beiden Tutorials 1 und 2 als meinen Code basiert auf, was ich in diesen gelesen habe.
Ich bin mit dem gleichen Problem konfrontiert. Ich übergebe ein Array von Elementen und die Delegierungsmethode wird nur ausgelöst, wenn ich die App neu starte. –
Die Callbacks sind inkonsistent und die Downloads nehmen zu viel Zeit in Anspruch. Mit kleinen Dateien habe ich es mit dem Simulator ausprobiert und einige kleine Bilddateien heruntergeladen. Die Callbacks für den fertigen Download brennen, nachdem die Downloads vor 2 oder 3 Minuten abgeschlossen sind Ursachen Verzögerung für den Start der nächsten Datei heruntergeladen werden.Das Problem passiert, sobald ich meine app in den Hintergrund. Im Vordergrund die gleichen Funktionen funktionieren gut. – Sulabh
Befolgen Sie alle Anweisungen in https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html#//apple_ref/doc/uid/TP40013509-SW44 (Hintergrundübertragung Überlegungen)? Ich meine, Sie verwenden Hintergrundsitzungskonfiguration und implementieren alle erforderlichen Rückrufe in appDelegate und NSURLSessionDelegate? – user2260054