2012-11-06 24 views
6

Chciałbym wiedzieć, co dzieje się za kulisami, gdy użytkownik blokuje i odblokowuje ekran iPada. Mam aplikację, która pobiera pliki za pomocą NSURLConnection i pobieranie kończy się niepowodzeniem z błędem SOAP ("Nie można znaleźć serwera o podanej nazwie hosta"), ale nie po zablokowaniu ekranu przez użytkownika, ale po jego odblokowaniu. Bez względu na to, kiedy pojawi się błąd, pobieranie nigdy się nie zakończy. Jakieś pomysły, dlaczego i co można z tym zrobić?przerywa ekran blokady NSURLConnection

NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:300]; 

NSURLConnection* conn = [[NSURLConnection alloc] initWithRequest: request delegate: self]; 

Z tego co mogę powiedzieć, kiedy nacisnąć przycisk Start uzyskać:

applicationWillResignActive 
applicationDidEnterBackground 

i po wspominam aplikację po trzech minutach uzyskać:

applicationWillEnterForeground 

i pobieranie jest już zakończone lub postępuje nawet w tle.

Kiedy zostawiam go w tle dłużej (5 minut), upłynie limit czasu z błędem.

Po zablokowaniu ekranu otrzymuję tę samą kolejność stanów aplikacji, ale także komunikat o błędzie rozłączenia pobierania.

Dziękujemy!

+0

Szukam również eleganckiego rozwiązania tego problemu - najlepiej takiego, który nie wymaga anulowania połączenia. – Snips

Odpowiedz

6

Domyślam się, że połączenie jest rozłączane, ponieważ działa, gdy aplikacja wchodzi w tło, a nie masz poprawnych implementacji, aby go uruchomić. Może powinieneś rzucić okiem na dokumentację Apple'a Background Execution and Multitasking. Pokazuje, jak pozostawić aplikację działającą w tle do około 10 minut bez przerywania. Poszukaj przykładowego kodu i dowiedz się, jak rozwiązać problem:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 
     // Clean up any unfinished task business by marking where you. 
     // stopped or ending the task outright. 
     [application endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 

    // Start the long-running task and return immediately. 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     // Do the work associated with the task, preferably in chunks. 

     [application endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }); 
} 
+0

Dziękuję. To wygląda obiecująco. – TrekOnTV2017

+0

Dlaczego natychmiast wrócić? Jeśli tak, jak będzie kontynuowane połączenie z Internetem? – Shamsiddin

+0

@yeesterbunny jak korzystać z tej metody? Muszę użyć tego bgTask w tej części mojej aplikacji, którą chcę pracować w tle? – user2545330