2015-08-13 2 views
10

Я использую WKWebView в приложении Swift, созданном для iOS 8+. Я использую экземпляры WKWebView во множестве представлений в моем приложении, например. в каждой вкладке в моем контроллере представления вкладок интерфейс основан на WKWebView.Как определить причину сбоя WKWebView

Я и мои тестеры заметили, что эти взгляды иногда исчезают полностью, и после изучения этой проблемы кажется, что WKWebView может сработать, а пустой вид - результат. К счастью, это не сбивает приложение из-за того, как работает WKWebView, но я также не понимаю, как ловить/записывать информацию о том, что привело к его сбою (если это на самом деле происходит).

Как определить, если/почему WKWebView разбился?

Мое текущее решение проблемы заключается в том, что я использую KVO (на самом деле, KVOController) Facebook, чтобы отслеживать свойство URL-адреса WKWebView, и если он идет от не-ниль до нуля, я предполагаю, что произошел сбой и я перезагружать 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 
    } 
} 

Но, очевидно, было бы неплохо, чтобы выяснить причину аварии.

+1

Я вижу аварию wkwebview в Кордове, а также не имеют ни малейшего представления о том, что делать в результате белый экран. – jimmont

+0

Я также вижу крах WKWebView в Кордове. Плагин, который я использую, просто перезагружает браузер. Однако это теряет всю информацию о состоянии, которую я сохранил в веб-приложении. Кто-нибудь сделал какой-либо прогресс в определении того, как определить, что на самом деле вызывает крах (коды ошибок и т. Д.)? – Shoerob

ответ

7

Это очень неприятная проблема WKWebView, с которой мы столкнулись также в Firefox для iOS.

Смотрите следующий отчет об ошибке https://bugs.webkit.org/show_bug.cgi?id=148685

У меня нет отличное решение, но у меня есть две подсказки:

во-первых, мы также делаем перезагрузку, когда мы узнали через КВО, что webView.URL оказалось nil. Однако оказывается, что он вызывает nil по ряду событий. Например, когда происходит перенаправление и, возможно, также при отправке формы. Так что это не идеально.

Во-вторых, в iOS9 существует новый API для обнаружения, когда процесс содержимого WebKit умер. Мы еще не пробовали это, но я думаю, что это будет лучший триггер для перезагрузки webView.

Там нет документации еще я думаю, но вы можете увидеть это в заголовочных файлах:

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

Stefan, в настоящее время я сталкиваюсь с той же проблемой, но вышеупомянутый метод делегата вообще не вызван. infact ни один из методов ошибки не вызван, когда webview или wkwebview полностью зависает. Есть ли у нас какие-либо другие предложения по устранению проблемы?Веб-просмотр, который я обрабатываю, отлично работает, но когда дело доходит до рендеринга на WKWebView, он зависает. – lifemoveson

+0

Был ли прогресс в этом вопросе? Приложение «WKWebView» часто сбой, обычно при вводе текста в текстовое поле или нажатии кнопки. – Fizzix

+0

То же самое здесь. Этот делегат не может быть вызван в любое время. – arqam

0
  • (аннулируются) webViewWebContentProcessDidTerminate: (WKWebView *) Webview NS_AVAILABLE (10_11, 9_0); Этот делегат получает вызов только в iOS9.but, если вы перезагружаете webview, вы потеряете всю сохраненную информацию о состоянии. возможно может сохранить информацию BEFOR называется [Webview перезагрузкой]

, например:

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]; 
}]; 
Смежные вопросы