2017-02-13 7 views
10

Ich versuche, eine Reihe von Dateien mit NSURL Hintergrundsitzung mit nsurlsessiontask herunterladen. Alles funktioniert wie Charme, wenn die App im Debugging-Modus ausgeführt wird (wenn das Gerät mit Xcode verbunden ist), funktioniert nicht, wenn Sie das Gerät (iPad) von Xcode trennen.NSURLSession Hintergrund Download funktioniert nicht

Ich benutze Xcode 7.3.1 mit iOS 9.3.5. Ich habe bereits Wochen damit verbracht, dieses seltsame Verhalten nachzuzeichnen, aber habe keine Durchbrüche. Möglicherweise fehlt mir etwas, um Hintergrund-Download zu implementieren. Kürzlich aktualisierter Xcode zu 8.1.2 und iOS zu 10.2.1 unter der Annahme, dass die Aktualisierung das Problem lösen könnte, aber nicht.

+5

Update Ihre Frage mit Ihrem Code so leicht einige Fehler oder jede Art von Fehler, die Sie Gesicht –

+2

Fügen Sie Ihren Code hinzu, um zu verstehen, was Sie falsch machen? –

+2

Sie sollten NSURLSessionDownloadTask und nicht NSURLSessionTask verwenden, um Dateien herunterzuladen. Und pls zeigen Code. Ansonsten ist es nur ein Ratespiel, das nie enden wird. – GeneCode

Antwort

0

meine Arbeits Code Kasse,

NSURL *url = [NSURL URLWithString:imageURL]; 
NSURLSessionTask *_imageDownloadTask = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
    if (data) { 
      //Here you can read your files from data 
     if (image) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
        //Save your files here for cache purpose 
       @try { 
        //You can handle onDownloadFinishWithFile: here too using delegate protocol 
       } 
       @catch (NSException *exception) { 
          NSLog(@"%@", exception.reason); 
       } 
       @finally { 
        // Defines a block of related code that is subsequently executed whether an exception is thrown or not. 
       } 
      }); 
     } 
    } 
}]; 
[_imageDownloadTask resume]; 

[Hinweis: ich oben Code verwenden Bilder zum Download].

0

Stellen Sie sicher, dass das Hintergrundabruf unter den Hintergrundmodi in den Funktionen aktiviert ist. enter image description here

+0

Diese Option ist bereits aktiviert –

1

Wählen Sie im Projektnavigator das Projektziel auf der oberen Seite aus. Als nächstes klicken Sie im Hauptfenster auf die Registerkarte Fähigkeiten, und dort werden alle Funktionen angezeigt, die Sie einfach mit einem Schalter aktivieren oder deaktivieren können. Suchen Sie unter anderem den Bereich "Hintergrundmodi" (der zweite am Ende) und klicken Sie auf den Schalter rechts daneben, um ihn zu aktivieren. enter image description here

Danach swith 'Hintergrund holen'.

enter image description here

+0

Diese Option wurde bereits hinzugefügt –

0

untenstehenden Link verweisen und folgen Sie den Schritten

https://www.appcoda.com/background-transfer-service-ios7/

-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session{ 
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate; 

// Check if all download tasks have been finished. 
[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { 
    if ([downloadTasks count] == 0) { 
     if (appDelegate.backgroundTransferCompletionHandler != nil) { 
      // Copy locally the completion handler. 
      void(^completionHandler)() = appDelegate.backgroundTransferCompletionHandler; 

      // Make nil the backgroundTransferCompletionHandler. 
      appDelegate.backgroundTransferCompletionHandler = nil; 

      [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
       // Call the completion handler to tell the system that there are no other background transfers. 
       completionHandler(); 

       // Show a local notification when all downloads are over. 
       UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
       localNotification.alertBody = @"All files have been downloaded!"; 
       [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification]; 
      }]; 
     } 
    } 
}]; 

}

+0

Ein Link zu einer Lösung ist willkommen, aber stellen Sie bitte sicher, dass Ihre Antwort ohne sie nützlich ist: [Kontext um den Link hinzufügen] (// meta.stackexchange.com/a/8259) Damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es da ist, geben Sie den relevantesten Teil der Seite an, auf den Sie verlinken, falls die Zielseite nicht verfügbar ist. [Antworten, die kaum mehr als ein Link sind, können gelöscht werden.] (// stackoverflow.com/help/deleted-answers) – FelixSFD

Verwandte Themen