У меня проблема с функциями goBack / goForward React Native WebViews, работающими должным образом на Android. Вот основные принципы моего варианта использования:
- У меня есть приложение RN со списком компонентов, которые при нажатии открывают новый экран с помощью WebView и загружают URL-адрес, переданный из компонента.
- URL-адрес, переданный в WebView, имеет определенные параметры, добавленные к нему. Эти параметры используются моим веб-сервером для удаления определенных элементов с веб-страницы, чтобы сделать их более удобными для приложений, например заголовок, рекламу и т. Д.
- Любая последующая ссылка, нажатая в WebView, по большей части попадает в 1 из 2 категорий: A) внутренние URL-адреса на другие страницы моего веб-сайта, для которых требуются эти конкретные параметры, добавленные к ним, и B) внешние URL-адреса на страницы, отличные от моего веб-сайта, которые затем открываются в собственном браузере или собственном клиенте через RN Linking.
- Я использую обработчик 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 сохранялся должным образом?