Как правильно слушать изменения навигации в UIWebView?

Я заметил, что [UIWebViewDelegate webView:shouldStartLoadWithRequest:navigationType:] вызывается только с традиционными <a href="..."> ссылками, а не с веб-приложениями JavaScript для навигации по страницам.

Например, если я перейду к m.facebook.com в UIWebView и начну использовать верхнюю навигацию (см. снимок экрана ниже), он никогда не запускает этот метод делегирования.

Причина, по которой я хочу, чтобы метод был подключен, заключается в том, что я хочу добавить кнопки назад и вперед над UIWebView, но мне нужно знать, когда включать/отключать эти кнопки. Есть ли какой-нибудь другой метод делегата, который я должен использовать для правильного прослушивания изменений навигации?

Обновление: я также должен отметить, что Mobile Safari корректно обновляет состояние кнопки "Назад/Пересылка" на мобильном сайте Facebook, поэтому я надеюсь, что Apple предоставит возможность разработчикам также сделать это.

введите описание изображения здесь

Ответ 1

Кажется, что это просто не поддерживается UIWebViewDelegate, ни WKNavigationDelegate (который я только что проверил в facebook). Есть несколько вариантов, перечисленных в этом ответе:

  • javascript-инъекция для записи изменений страницы (читайте в файле history.pushState).
  • KVO для просмотра изменений в веб-просмотре (например, изменение размера прокрутки)
  • просмотр изменений названия, как указано выше.
  • проверка обновлений при каждом удалении пользователя.

Update

Я также попробовал этот ответ на facebook, который включает в себя инъекцию javascript для захвата XMLHTTPRequests во время каждой новой загрузки страницы. Это похоже на то, что вы просите, но это немного взломан. Некоторые вкладки facebook не работают должным образом с очень простой реализацией, но вы можете решить проблемы.