WKWebView не перенаправляет контент при загрузке другого URL-адреса

В настоящее время я разрабатываю приложение, которое использует UIWebView для отображения некоторого контента. Он отлично работал с UIWebView, но мы решили переключиться на WKWebView, когда мы подняли требование ОС до 8.1. Мы заметили огромное улучшение производительности, но некоторые простые мысли, которые привыкли работать нормально, начали сбой сейчас. После некоторых исследований мне удалось понять, что происходит, но я не понимаю, как это исправить. Мне было интересно, может ли кто-нибудь помочь мне в этом...

URL-адрес наших загрузок webview занимает довольно много времени, чтобы закончить работу, поэтому перед запуском запроса мы загружаем статический счетчик, чтобы пользователь не чувствовал, что приложение сошло с ума. Цикл загрузки для этого статического содержимого уже настроен, поэтому мы не запускаем URL-запрос до тех пор, пока не будет загружен статический контент. Это прекрасно работает, если пользователь не поворачивает устройство. Вот что можно увидеть:

(мне пришлось изменить представление для целей конфиденциальности. Я не являюсь владельцем этого кода, в конце концов: -))

enter image description here

Я использую этот html-код для проверки размера. Цвет фона тела темно-серый, а уродливая светло-серая коробка расширяется до 100% ширины, вычитая края. Все идет нормально. Но если пользователь поворачивает устройство, это происходит:

enter image description here

Это жутко, поскольку, по-видимому, тело убирается, чтобы соответствовать максимальной ширине, но внутренний div обрабатывает неправильный относительный размер. Это продолжается до тех пор, пока запрос обрабатывается. Когда я заставляю тайм-аут сделать запрос неудачным, WKWebView повторно отображает и показывает его правильный внешний вид:

enter image description here

Как только я это обнаружил, я безуспешно пытался подписаться на наблюдателя ротации и принудительно повторно отобразить на веб-просмотре:

  • Вызов viewNeedsDisplay для UIWebView и UIScrollView внутри
  • Изменение размера UIWebView
  • Повторное позиционирование содержимого UIScrollView

Итак, мои выводы до сих пор:

  • Это не произошло на UIWebView, только на новом WKWebView (я снова это подтвердил, подтвердил)
  • Похоже, что WKWebView не отображает представления правильно, пока он загружается.

Кто-нибудь знает, есть ли способ исправить это? Что-то вроде одного магического свойства, которое я пропускаю, по умолчанию отключено? Я не хочу думать, что они сломали эту часть, когда они переделали веб-просмотр... Спасибо заранее:)

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

  • Изменение DOM асинхронно с помощью обратных вызовов javascript/native вращения не работает. Изменения не будут отображаться до завершения HTTP-запроса.
  • Вызов http-запроса в другом потоке с использованием метода dispatch_async не работает. Под капотом WKWebView, вероятно, заканчивается тем же потоком, что и если вы вызываете его из основного потока.

Ответ 1

Если вы не против немного взломать, есть способы сделать это с помощью Javascript:

  • Вы можете добавить Javascript, который обнаруживает изменения, такие как window.orientation и window.onresize. Посмотрите, вызвано ли какое-либо событие, связанное с кадром. Если они вызываются, просто измените размер div на Javascript.

  • Если события никогда не срабатывают, вы можете подделать их самостоятельно, используя evaluateJavaScript:completionHandler:

  • Вы также можете сделать свои собственные события таким образом. Просто отправьте размер div script, когда вы обнаружите изменение ориентации устройства в своем приложении.

  • Если вы загружаете Javascript, вы можете посмотреть теги async и defer тега <script>. Это означает, что вам придется изменить код в веб-просмотре.

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

Я также предлагаю вам заполнить отчет об ошибке в https://bugreport.apple.com/, чтобы вы знали, является ли это ожидаемым поведением или нет.

Ответ 2

Пока у меня нет решения для WKWebView не рендеринга при загрузке содержимого, я бы предложил другое решение вашей проблемы.

Вы можете изменить вид загрузки с страницы, загруженной в веб-просмотр, на собственное представление iOS. Просто добавьте subview к основному виду, над веб-представлением, когда вы начнете загружать и удалять его при завершении загрузки. Это будет отлично работать с вращением, и вы можете иметь тот же опыт, что и раньше.

Другим решением было бы загрузить ваше загрузочное представление в UIWebView, как вы это делали, прежде чем это будет хорошо работать с поворотом и нормальной страницей в WKWebView позади него. Когда страница загружается, вы также просто скрываете или удаляете UIWebView.