React Native WebView goBack теряет параметры - Android - PullRequest
0 голосов
/ 24 апреля 2020

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

  1. У меня есть приложение RN со списком компонентов, которое при нажатии открывает новый экран с WebView и загружает URL, переданный из составная часть.
  2. URL, переданный в WebView, имеет определенные параметры, добавленные к нему. Эти параметры используются моим веб-сервером для удаления определенных элементов с веб-страницы, чтобы сделать их более дружественными к приложениям, например, заголовок, реклама и т. Д. c ..
  3. Любая последующая ссылка, указанная в WebView, попадает в 1 из 2 категории по большей части: A) внутренние URL-адреса других страниц моего веб-сайта, для которых требуются указанные параметры c, добавленные к ним, и 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 единственный стек назначения с параметрами добавляется в стек истории, и все, кажется, работает должным образом.

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

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

1 Ответ

0 голосов
/ 28 апреля 2020

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

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

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

...