WKWebView не завершает/таймаут, когда нет доступа в Интернет
На локальной странице HTML есть удаленный тег Javscript, с которого я перехожу через WkWebView, который никогда не заканчивает загрузку (как в случае, если устройство iOS не подключено к Интернету, либо интернет-устройство слишком медленное),
К сожалению, WKWebView никогда не прерывает попытку загрузить этот актив и никогда не переходит к моему WKNavigationDelegate (т.е. не вызывается ни -webView:didFailNavigation:withError:
, ни -webView:didFinishNavigation: neither
), поэтому пользователи застревают с пустой HTML-страницей, которая никогда полностью не разрешает и никогда не выходят из строя.
К счастью, в некоторых сценариях, которые я отлаживал через удаленный отладчик JOS от Safari, я заметил, что мы запустили ошибку Failed to load resource: The Internet connection appears to be offline
, зарегистрированную на консоли, а в других (например, некоторые устройства в режиме полета) WKWebView никогда не кажется к таймауту с этой ошибкой или сдаваться, поэтому никаких обратных вызовов WKNavigationDelegate не запускаются.
Вы можете воспроизвести этот сценарий самостоятельно, используя симулятор iOS 8.2 с любым приложением WKWebView iOS, перейдите к любому файлу с локально обслуживаемым HTML файлом, затем добавьте тег script с любым удаленным URL-адресом, затем активируйте подключение к Интернету, чтобы "100% -ная потеря" с помощью Apple Network Link Conditioner.
Каким будет лучший способ заставить WkWebView таймаутом/возвратом через обратный вызов с ошибкой или успешным выполнением его WKNavigationDelegate?
Ответы
Ответ 1
Try:
WKNavigationDelegate
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error
Вы можете проверить ошибку, обычно у вас будет error.code -1009:
Проверьте этот список: Коды ошибок
Ответ 2
Я думаю, вам нужно будет сделать это на своей HTML-странице. Вы можете включить небольшой JavaScript, который запускает таймер, и проверяет, загружен ли ваш удаленный script.
Если он не загружен, JavaScript может показывать ошибку на странице напрямую или уведомлять ваше приложение через обработчик сообщения script.
(Я не думаю, что у HTML есть API, который может использовать страница, чтобы узнать о ошибках загрузки содержимого. Есть некоторые намеки на то, что на Проверить внешний script загружен)
Ответ 3
Я настроил н/ж класс достижимости, используя класс доступности, а затем, если н/ж доступен, загрузите веб-просмотр, иначе покажите пользователю сообщение об ошибке.