2013-10-30 14 views
7

Versione breve: nel mio background di app il recupero funziona come un incantesimo tranne per il fatto che quando provo a caricare i contenuti in una webview non fa nulla!Carica UIWebView in un recupero in background

Versione lunga: ho impostato le giuste capacità nel progetto, impostare l'operazione di recupero e intervallo di implementare il metodo

- (void) application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 

come negli esempi e funziona. Ma poi, per completare il recupero dello sfondo ho bisogno di caricare alcuni contenuti in un UIWebView. E questo non funziona. Semplicemente il processo in qualche modo "perdersi" Quando chiamo:

[myWebview loadRequest:request]; 

(ovviamente funziona quando in primo piano, ma non fa nulla, quando in background).

cerco anche di forzare la WebView da caricare nel thread principale, ma poi il sistema è sufficiente arrestarlo 'fino al ritorno applicazione in modalità primo piano (ha senso, siamo in fondo!)

Così , c'è un modo per caricare un UIWebView mentre è in background? Si prega di notare che non posso semplicemente scaricare i contenuti con NSURLSession, perché la pagina web contiene javascript che carica alcuni fotogrammi (e non posso chiedere una riprogettazione della pagina web).

Edit: probabilmente non ero abbastanza crear quando ho scritto la domanda, ma cercando di eseguire un compito nel main_queue (con un dispatch_async o similmente metodi), mentre in uno sfondo fetch non funziona. Ho provato prima di chiedere ...

+0

Quando si chiama il gestore di completamento? –

+0

Aspetto di richiamarlo dopo aver caricato la vista Web, ma il carico non si avvia nemmeno –

+0

La vista Web è effettivamente presente in una gerarchia di viste quando si esegue in background (ad es. La proprietà 'window' restituisce qualcosa) ? –

risposta

2

All'11/11/2013 (iOS 7.0.3) non è possibile. Ho appena lasciato questa risposta così le persone non avranno informazioni sbagliate.

La soluzione di Eduardo Arenas Prada funziona perfettamente se l'applicazione è in primo piano , ma non in uno sfondo recuperare tristemente.

+1

Questo è ancora vero oggigiorno: 27 aprile 2014. –

3

Quando si desidera aggiornare gli elementi dall'interfaccia utente, è necessario accedervi nella coda principale (o thread) dell'applicazione. Quello che vorrei raccomandare è che tu continui a ottenere i dati di cui hai bisogno in background, ma quando è il momento di aggiornare il tuo UIWebView, fallo nel thread principale. Si può fare in questo modo:

dispatch_async(dispatch_get_main_queue(), ^{ 

     // Load fetched data in the Web View 

    }); 

o si potrebbe creare un metodo che aggiorna i dati sulla UIWebView e chiamarlo dal thread in background utilizzando:

[self performSelectorOnMainThread:@selector(method:) withObject:fetchedData waitUntilDone:YES]; 

Questo farà sì che si accede al UIWebView dalla discussione corretta.

Spero che questo aiuti.

+0

No, non funziona! Lo provo già, ma come ho scritto se eseguo il caricamento della vista web nella coda principale l'esecuzione del blocco si ferma semplicemente finché l'app non ritorna in primo piano (quindi inizia immediatamente, ma ovviamente è troppo tardi ...) –

+0

Cosa ho significa che è necessario separare il codice in due parti. Uno recupera i dati dal server (credo che ti aspetti di ricevere qualche html e javascript) e l'altro carica i dati recuperati in 'UIWebView'. La prima parte dovrebbe essere chiamata da un thread in background in modo che non blocchi l'interfaccia utente e, una volta ottenuti i dati, è necessario aggiornare 'UIWebView' nel thread principale, per garantire che la vista venga aggiornata. Prendendo questo in considerazione, usando '[myWebview loadRequest: request];' probabilmente non funzionerà per te, e dovresti trovare un altro modo per aggiornare la tua vista web. –

+0

Non riesco a separare tristemente ... La javascript che ho scaricato fa scattare altri download, quindi ho bisogno della vista web per eseguirli .. –

Problemi correlati