2012-11-06 28 views
6

Mi piacerebbe sapere cosa succede dietro le quinte quando l'utente blocca e sblocca lo schermo dell'iPad. Ho un'app che scarica i file usando NSURLConnection e i download falliscono con un errore SOAP ("Impossibile trovare un server con il nome host specificato"), ma non quando l'utente blocca lo schermo, ma quando lo sblocca. Indipendentemente dal fatto che si verifichi l'errore, il download non finisce mai. Qualche idea del perché e cosa si potrebbe fare al riguardo?interrupt schermata di blocco NSURLConnection

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

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

Da quello che posso dire, quando ho colpito il tasto Home ottengo:

applicationWillResignActive 
applicationDidEnterBackground 

e dopo mi ricordo l'applicazione dopo tre minuti ottengo:

applicationWillEnterForeground 

e la il download è già terminato o è proseguito anche in background.

Quando lo lascia sullo sfondo più a lungo (5 minuti), si verifica un errore.

Quando blocco lo schermo ottengo lo stesso ordine degli stati dell'applicazione, ma anche un messaggio di errore sulla disconnessione del download.

Grazie!

+0

Sto cercando una soluzione elegante a questo problema troppo - preferibilmente uno che non comporta l'annullamento della connessione. – Snips

risposta

6

La mia ipotesi è che la connessione venga disconnessa perché è in esecuzione quando l'app entra in background e non si dispone delle implementazioni corrette per mantenerla in esecuzione. Forse dovresti dare un'occhiata alla documentazione di Apple Background Execution and Multitasking. Ti mostrerà come lasciare la tua app in esecuzione in background fino a circa 10 minuti senza essere terminata. Cercare il seguente codice di esempio e imparare come si potrebbe essere in grado di risolvere il problema:

- (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

Grazie. Questo sembra promettente. – TrekOnTV2017

+0

Perché tornare immediatamente? Se sì, come continuerà la connessione con internet? – Shamsiddin

+0

@yeesterbunny come utilizzare questo metodo? Devo usare questo bgTask in quella parte della mia app che voglio lavorare in background? – user2545330

Problemi correlati