2015-08-13 12 views
10

Sto utilizzando WKWebView in un'app Swift creata per iOS 8+. Io uso le istanze di WKWebView in una varietà di visualizzazioni nella mia app, ad es. in ciascuna scheda del mio controller di visualizzazione schede, l'interfaccia è basata su WKWebView.Come determinare perché WKWebView si blocca

Io ei miei tester abbiamo notato che queste visualizzazioni a volte diventano completamente vuote e, dopo aver ricercato il problema, sembra che WKWebView possa arrestarsi in modo anomalo e che la visualizzazione vuota sia il risultato. Fortunatamente, non fa cadere l'app a causa del modo in cui funziona WKWebView, ma non sono chiaro su come intercettare/registrare le informazioni su ciò che lo ha causato in crash (se questo è effettivamente ciò che sta accadendo).

Come determinare se/perché un WKWebView si è arrestato in modo anomalo?

La mia soluzione attuale per il problema è che io uso KVO (in realtà, Facebook KVOController), per monitorare la proprietà "URL" di WKWebView, e se va da non-zero a zero, presumo che si sia verificato un arresto anomalo e ricarico il WebView:

kvoController?.observe(webView, keyPath: "URL", options: NSKeyValueObservingOptions.New|NSKeyValueObservingOptions.Old) { (areaViewController, webView, change) -> Void in 
    if change[NSKeyValueChangeNewKey] is NSNull && !(change[NSKeyValueChangeOldKey] is NSNull) { 
     areaViewController.setup() // reload our webview 
    } 
} 

Ma ovviamente sarebbe bello capire la causa principale dello schianto.

+1

sto vedendo l'incidente wkwebview a Cordova e hanno anche la minima idea di cosa fare per il conseguente bianco-schermo. – jimmont

+0

Sto anche vedendo l'arresto di WKWebView in Cordova. Il plugin che sto usando ricarica semplicemente il browser. Tuttavia, questo perde tutte le informazioni di stato che ho memorizzato nell'applicazione web. Qualcuno ha fatto dei progressi nel determinare come rilevare cosa causa effettivamente un arresto anomalo (codici di errore, ecc.)? – Shoerob

risposta

7

Questo è un problema di WKWebView molto sgradevole che abbiamo riscontrato anche in Firefox per iOS.

Vedere il seguente bug report https://bugs.webkit.org/show_bug.cgi?id=148685

non ho grande soluzione, ma io ho due punte:

First, stavamo anche facendo la ricarica quando abbiamo scoperto tramite KVO che webView.URL trasformato nil. Tuttavia si scopre che diventa nil su un numero di eventi. Ad esempio quando si verifica un reindirizzamento e probabilmente anche quando viene inviato un modulo. Quindi questo non è l'ideale.

In secondo luogo, in iOS9 è disponibile una nuova API per rilevare quando il processo di contenuto WebKit è morto. Non abbiamo ancora provato questo, ma penso che sarà un grilletto migliore per ricaricare il webView.

v'è alcuna documentazione ancora credo, ma si può vedere questo nei file di intestazione:

- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView NS_AVAILABLE(10_11, 9_0); 
+0

Stefan, attualmente sto affrontando lo stesso problema ma il metodo delegato sopra non viene richiamato affatto. infatti nessuno dei metodi di errore viene chiamato quando la webview o wkwebview si blocca completamente. Abbiamo altri suggerimenti su come risolvere il problema?La webview che sto rendering funziona perfettamente ma quando si tratta di rendering su WKWebView si blocca. – lifemoveson

+0

Ci sono stati progressi in merito? La mia applicazione 'WKWebView' si blocca spesso, di solito quando si immette del testo in una textarea o si fa clic su un pulsante. – Fizzix

+0

Lo stesso qui. Questo delegato non viene chiamato in qualsiasi momento. – arqam

0
  • (void) webViewWebContentProcessDidTerminate: (WKWebView *) WebView NS_AVAILABLE (10_11, 9_0); Questo delegato viene chiamato solo su iOS9.but se ricarichi la webview, perderai tutte le informazioni di stato memorizzate. forse può salvare informazioni befor chiamato [reload WebView]

ad esempio:

NSString *jsString = @"var arry=[]; 
for(var i=0; i<sessionStorage.length; i++){ 
    var a={};a[sessionStorage.key(i)]=sessionStorage.getItem(sessionStorage.key(i));arry.push(a)};arry"; 

    [webView evaluateJavaScript:jsString completionHandler:^(id _Nullable obj, NSError * _Nullable error) { 
    NSLog(@"jsString1===error=%@",error); 
    NSLog(@"jsString1==obj==®%@",obj); 
    if (obj == NULL ||obj ==[NSNull class]||obj==nil) { 
     //重启webview 
     [webView reload]; 
     return ; 
    } 
    //保存sessionStorage 
    NSArray *arr = (NSArray*)obj; 

    //保存后重启webview 
    [webView reload]; 
}];