React Native WebView goBack теряет параметры - Android

У меня проблема с функциями goBack / goForward React Native WebViews, работающими должным образом на Android. Вот основные принципы моего варианта использования:

  1. У меня есть приложение RN со списком компонентов, которые при нажатии открывают новый экран с помощью WebView и загружают URL-адрес, переданный из компонента.
  2. URL-адрес, переданный в WebView, имеет определенные параметры, добавленные к нему. Эти параметры используются моим веб-сервером для удаления определенных элементов с веб-страницы, чтобы сделать их более удобными для приложений, например заголовок, рекламу и т. Д.
  3. Любая последующая ссылка, нажатая в WebView, по большей части попадает в 1 из 2 категорий: A) внутренние URL-адреса на другие страницы моего веб-сайта, для которых требуются эти конкретные параметры, добавленные к ним, и B) внешние URL-адреса на страницы, отличные от моего веб-сайта, которые затем открываются в собственном браузере или собственном клиенте через RN Linking.
  4. Я использую обработчик onNavigationStateChange, чтобы определить, в какой категории находится новый URL-адрес (ссылка, которую использовал пользователь), и выполняет одно из следующих действий: A) к внутренним URL-адресам добавляются необходимые параметры, WebView принудительно прекращает загрузку, затем URL-адрес с обязательными параметрами используется для установки состояния URL-адреса, переданного в качестве источника в WebView. Это эффективно останавливает загрузку URL-адреса без параметров, а затем заставляет WebView повторно отображать с новым URL-адресом с параметрами. B) внешние URL-адреса заставляют WebView останавливать загрузку, а затем открываются в собственном браузере или собственном клиенте через компонент RN Linking.

Боковое примечание: свойства canGoBack и canGoForward NativeEvent также фиксируются в обработчике onNavigationStateChange и используются для установки внутреннего состояния компонента экрана и, таким образом, используются для включения кнопок назад и вперед на моей простой панели инструментов навигации WebView. Кажется, это работает нормально.

Я считаю, что проблема не в том, что параметры потеряны, а в том, что URL-адрес без параметров и URL-адрес с параметрами добавляются в стек истории WebView, по крайней мере, на Android. У меня действительно были смешанные результаты, иногда оба URL-адреса добавляются в стек истории, иногда только один из них. Для iOS единственный URL-адрес назначения с параметрами добавляется в стек истории, и все работает, как ожидалось.

Я также попытался использовать обработчик onShouldStartLoadWithRequest, чтобы остановить загрузку URL-адресов без необходимых параметров, добавить параметры, а затем установить состояние с правильным URL-адресом, но этот подход полностью искажает стек истории. Я также попытался остановить загрузку WebView и ввести JS, чтобы перенаправить WebView на правильный URL-адрес, но это также, похоже, нарушает стек истории.

Кто-нибудь знает, как правильно перехватить последующие изменения URL-адреса WebView и добавить параметры в запрос, чтобы стек истории WebView сохранялся должным образом?


person drquiz    schedule 24.04.2020    source источник


Ответы (1)


В итоге я сделал несколько вещей, чтобы решить свои проблемы:

  1. В Android, если URL-адрес не имел необходимых параметров, я заставлял WebView не загружать URL-адрес из обработчика onShouldStartLoadWithRequest, возвращая false, и вместо этого обновлял состояние URL-адреса с параметрами, чтобы принудительно выполнить повторную визуализацию. Одно это может вызвать проблемы, связанные со встроенным стеком истории WebView и навигацией назад / вперед, поэтому я тоже закончил ...
  2. Создание настраиваемого массива истории URL-адресов и настраиваемого управления навигацией.

Обратной стороной моего подхода является то, что onLoadProgress не запускается на Android из-за возврата false в обработчике onShouldStartLoadWithRequest (я предполагаю), несмотря на принудительную повторную визуализацию с новым URL-адресом. Поэтому мне пришлось добавить обходной путь для моего анимированного индикатора выполнения загрузки страницы, установив значение прогресса на небольшое число в обратном вызове onStartLoad и установив значение прогресса равным 1 в обратном вызове onEndLoad (которым я все равно был).

person drquiz    schedule 27.04.2020