2017-02-13 48 views
10

Próbuję pobrać pewną liczbę plików przy użyciu sesji tła NSURL z nsurlsessiontask. Wszystko działa jak uroku, gdy aplikacja działa w trybie debugowania (gdy urządzenie jest podłączone do Xcode), nie działa podczas odłączania urządzenia (iPad) od Xcode.Pobieranie tła NSURLSession nie działa

Używam Xcode 7.3.1 z iOS 9.3.5. Już spędziłem tygodnie na śledzeniu tego dziwnego zachowania, ale nie miałem żadnych przełomów. Być może brakuje mi czegoś do wdrożenia pobierania w tle. Niedawno uaktualniony kod Xcode do wersji 8.1.2 i iOS do wersji 10.2.1 przy aktualizacji może rozwiązać problem, ale tak nie jest.

+5

zaktualizować swoje pytanie z kodem tak łatwo znaleźć jakiś błąd lub jakikolwiek rodzaj błędu, że twarz –

+2

Dodaj swój kod, który pomoże zrozumieć, co robisz źle? –

+2

Do pobierania plików należy używać NSURLSessionDownloadTask, a nie NSURLSessionTask. A pls pokaż kod. W przeciwnym razie jest to tylko gra, która nigdy się nie skończy. – GeneCode

Odpowiedz

0

Zamówienie mój kod roboczych,

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]; 

[Uwaga: Używam powyższy kod aby pobrać obrazy].

0

Upewnij się, że pobieranie w tle w trybach tła w możliwościach jest zaznaczone. enter image description here

+0

Ta opcja jest już włączona –

1

W Nawigatorze projektu wybierz cel projektu w górnej części. Następnie, w głównym oknie, kliknij zakładkę Możliwości i zostaną wyświetlone wszystkie funkcje, które możesz włączyć lub wyłączyć po prostu za pomocą przycisku przełącznika. Wśród nich zlokalizuj obszar Tryby tła (drugi od końca) i kliknij przycisk przełącznika po jego prawej stronie, aby go włączyć. enter image description here

Po tym czasie użyj "Pobieranie w tle".

enter image description here

+0

Dodano tę opcję –

0

odnoszą poniżej link i wykonaj kroki

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

Link do rozwiązania jest mile widziany, ale upewnij się, że twoja odpowiedź jest przydatna bez niego: [dodaj kontekst wokół linku] (// meta.stackexchange.com/a/8259) aby inni użytkownicy mieli pojęcie, co to jest i dlaczego tam jest, a następnie zacytuj najbardziej odpowiednią część strony, do której prowadzi link, jeśli strona docelowa jest niedostępna. [Odpowiedzi, które są niewiele więcej niż link, mogą zostać usunięte.] (// stackoverflow.com/help/deleted-answers) – FelixSFD