UIWebView застрял после webViewDidStartLoad

Наше приложение iOS имеет веб-представление, которое отображает страницы из файла: URL. Когда пользователь прикасается к элементу <A> для переключения страниц, примерно в 20% случаев, он застревает следующим образом:

  1. <A> пользователя <A> ссылка
  2. Мы получаем обратный вызов WebView.shouldStartLoadWithRequest
  3. Мы получаем обратный вызов WebView.webViewDidStartLoad
  4. после этого ничего не происходит

На экране по-прежнему отображается исходная страница со ссылкой на нее. Мы можем разбить ловушку двумя способами:

  1. Поверните устройство
  2. Коснитесь экрана

В этот момент страница немедленно завершит загрузку.

Мы использовали рецепт отсюда:

Javascript console.log () в iOS UIWebView

чтобы дать нам некоторое представление о загрузке страницы. Мы помещаем материал javascript-side прямо в первый файл сценария, который мы загружаем на странице, и он не печатает свое сообщение, пока не будет выполнено обходное решение с вращающимся или касательным.

Похоже, что он застрял где-то между началом загрузки страницы и начинает оценивать материал на странице.

Мы пробовали целый ряд работ, ни одна из которых не помогла:

  • Установка location.href вместо использования тега
  • Установка location.href из таймаута javascript
  • В обратном вызове didStartLoad был создан поток, который вызывал setNeedDisplay в webView снова и снова

Любая идея, что мы можем делать неправильно?

Вы можете использовать gdb в XCode для отладки проблемы. Я думаю, что ссылки на сообщения, которые могут иметь точки останова:

 - (void)webViewDidStartLoad:(UIWebView *)webView - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 

Я также добавлю перерыв в том, что UIViewController показывает ваш UIWebView для:

 - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

Затем вы можете пройти и, надеюсь, поймать, что не так с вашим подклассом UIWebView.

Если вы не хотите добавлять точки останова, вы можете просто запустить приложение в отладчике XCode и нажать кнопку «приостановить выполнение» над окном консоли, когда ваше приложение перестанет отвечать на запросы при загрузке.

Кнопка завершения паузы GDB

Трудно понять, что происходит без какого-либо кода, но я уверен, что Xcode поможет вам быстро найти проблему.

Удачи!

Нашли решение для этого странного поведения, по крайней мере, в моем случае.

В моем приложении я создал подкласс UIWebView. Я знаю, что в документации на яблоки указано, что вы не должны подклассифицировать UIWebView. Но это «необходимо» в моем приложении.

Проблема в том, что я перезаписал scrollViewDidEndDragging: willDecelerate: без вызова super.

 - (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { // my code } 

становится

 - (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { [super scrollViewDidEndDragging:scrollView willDecelerate:decelerate]; // my code } 

Теперь он всегда загружает веб-сайт при нажатии на ссылку html.

  • Проведите анимацию в CSS3
  • WKWebView не перенаправляет контент при загрузке другого URL-адреса
  • Как получить слово в указанном месте на WKWebView?
  • Каковы последствия использования неподдерживаемого свойства WebKit?
  • Как изменить цвет выделения текста в WKWebView?
  • Включение рамки WebKit для iOS8 не позволяет выполнить проверку
  • iOS Webkit не работает на устройстве, но работает на симуляторе при быстром
  • Не удалось выполнить команду com.apple.WebKit.WebContent
  • iOS5 -webkit-overflow-прокрутка вызывает остановку работы сенсорных событий
  • Почему Apple относится к этим приложениям специально?
  • Это Facebook для iOS WebView User Agent?
  • Давайте будем гением компьютера.