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

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

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

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

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

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

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

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

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

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

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

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

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

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

Edit: Stuff Я пытался с момента создания сообщения, без успеха:

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

2 Solutions collect form web for “WKWebView не перенаправляет контент при загрузке другого URL-адреса”

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

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

  2. Если события никогда не срабатывают, вы можете подделать их самостоятельно, используя оценкуJavaScript: completeHandler:

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

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

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

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

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

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

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

  • Может ли WKWebView сохранять разрешение служб местоположения?
  • Обнаружение воспроизведения видео в компоненте WKWebView
  • Как удалить кеш WKWebview в iOS8?
  • Универсальные ссылки, не работающие с WKWebView
  • Видеокамера видео камеры устройства iOS на локальную страницу html в wkwebview
  • Предотвращение открытия универсальных ссылок в `WKWebView` /` UIWebView`
  • Снимок экрана WKWebview с аппаратным ускоренным контентом
  • Совместное использование файлов cookie между несколькими WKWebViews
  • Позиция HTML-элемента внутри WKWebView
  • iOS: WkWebView и Safari Mobile ведут себя по-разному
  • WKWebView не загружает локальные файлы под iOS 8
  • Interesting Posts

    iOS Share GIF для Messenger с использованием UIActivityViewController

    Внедрение google translation api в swift 3 iOS

    NSURLSessionDownloadTask не удаляет файл, когда приложение закрыто пользователем, и задача все еще активна

    Как узнать, будет ли контроллер вида представлением в виде popover или модального?

    Поиск uiswitch для ios 7 с настройками текста или изображения

    Автозаполнение Google Места на iOS – Не удается загрузить результаты поиска – попробуйте снова

    Способ сохранения объектов MPMediaItemCollection? (выбирается из iPod)

    Почему ARC не освобождает память после popViewController

    XCTest не связывает инфраструктуру iOS

    UITableView heightForHeaderInSection не работает

    Как вычеркнуть текст с пунктирной линией?

    Swift – удаление пробелов из строки не работает

    Почему iCloud иногда перестает работать?

    Строка состояния выводит содержимое вниз, только когда приложение запускается с включенной панелью состояния вызова

    Есть ли способ изменить положение текста в UITabBar или UITabBarItem?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.