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

Я настроил н/ж класс достижимости, используя класс доступности, а затем, если н/ж доступен, загрузите веб-просмотр, иначе покажите пользователю сообщение об ошибке.