UIWebView застревает после webViewDidStartLoad - PullRequest
4 голосов
/ 03 ноября 2011

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

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

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

  1. Поворот устройства
  2. Нажмите на экран

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

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

Javascript console.log () в iOS UIWebView

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

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

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

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

Есть идеи, что мы можем делать неправильно?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Вы можете использовать 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 Pause Execution Button

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

Удачи!

0 голосов
/ 08 ноября 2011

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

В моем приложении я создал подкласс UIWebView.Я знаю, что в документации Apple отмечается, что вы не должны создавать подкласс 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.

...