2014-10-22 6 views
6

Sto aggiornando il mio progetto da UIWebView a WKWebView. Nell'approccio UIWebView esistente in cui UIWebView non ha alcun genitore finché non esegue javascript e una volta che ha contenuto, aggiunge un genitore alla webview. Il contenuto viene visualizzato correttamente utilizzando UIWebView. Sto usando lo stesso approccio per WKWebView, tuttavia WKWebview è rimasto bloccato durante il caricamento. C'è un modo in cui possiamo eseguire javascript su wkwebview senza aggiungere genitore alla webview. Un'altra cosa interessante è che funziona su simulatore non sul dispositivo. Utilizzo di localHTTPServer per servire html, css e immagini.WKWebview non esegue javascript (richiesta XML XML) senza aggiungere una vista genitore

Qualsiasi suggerimento o suggerimento per risolvere il problema precedente.

risposta

10

Ho osservato un comportamento simile nella mia app in esecuzione socket.io in un WKWebView senza testa. Nel mio caso, il socket Web si disconnetterebbe tutto il tempo e non si ricollegherebbe.

Sembra che dal momento che WKWebView esegue javascript off-process che metterà in pausa qualsiasi javascript considerato inattivo per risparmiare risorse (< -IMO). Inattivo include non avere un genitore o l'app/dispositivo è inattivo. Quindi, sì, sembra che tu abbia ragione nel senso che ha bisogno di una vista genitore nella maggior parte dei casi. Sono stato in grado di ovviare a questo utilizzando il seguente codice:

WKWebViewConfiguration* webViewConfig = // set up config 

// provide empty frame rect 
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:webViewConfig]; 

// add to keyWindow to ensure it is 'active' 
[UIApplication.sharedApplication.keyWindow addSubview:webView]; 

Questo approccio garantisce almeno le piste javascript mentre l'applicazione è attiva e non influisce l'interfaccia utente. Se è necessario visualizzarlo in un secondo momento, è possibile rimuovere WebView dalla finestra Key dopo il rendering e ripristinare il frame. E, sì, ho anche notato che nel simulatore questo non è un problema (javascript funziona SEMPRE, indipendentemente dallo stato del genitore o dell'app)

Spero che questo aiuti!

+2

Wow. Incredibile, il modo in cui hai risolto il problema. Funziona. Tuttavia, a un certo punto dovremmo rimuovere webview da keywindow giusto? In caso contrario potrebbero verificarsi problemi di prestazioni o di memoria. – user1198982

+1

dipende. per me ne ho bisogno che funzioni sempre per mantenere attiva la connessione socket. ma certo, se non ne hai bisogno in esecuzione, perché non rimuoverlo :). – mattr

+0

Viene sollevato da Apple come un bug, esiste un radar aperto. –

2

La soluzione accettata ha funzionato per me un po 'di tempo. Ho cercato qualche altra cosa che sembra funzionare per me in modo coerente:

self.keepWebViewActiveTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 
           target:self 
           selector:@selector(_keepWKWebViewActive:) 
           userInfo:nil 
           repeats:YES]; 

Dove _keepWKWebViewActive è:

-(void) _keepWKWebViewActive:(NSTimer*) timer{ 
    if(self.webView) { 
     [self.webView evaluateJavaScript:@"1+1" completionHandler:nil]; 
    } 
}