React Native с WebView и глубокими ссылкамиAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 React Native с WebView и глубокими ссылками

Сообщение Anonymous »

Сейчас я разрабатываю приложение React Native с помощью WebView. У меня есть несколько ссылок из электронных писем, которые могут вести на мой сайт. В этом случае я хочу открыть свое установленное приложение и открыть WebView с этой ссылкой из электронной почты.
У меня это отлично работает, используя подписку Linking.addEventListener('url', ({url}) => ...).
Проблема в том, что когда я пытаюсь открыть ту же ссылку еще раз, она просто не переходит туда. Мне нужно открыть ссылку Б, если я хочу снова открыть ссылку А. Похоже на проблему с кэшем. Или простое обновление состояния реагирования. URL-адрес тот же, поэтому компонент ничего не перерисовывает (возможно). Я попытался использовать ключевую опору дополнительно, чтобы гарантировать повторную визуализацию WebView при изменении ключа. С этим тоже не повезло.
Может кто-нибудь подсказать обходной путь? Известна ли это проблема?
Я перепробовал много решений, но дело в том, что рукопожатие работает только в рабочей среде, поэтому мне нужно загрузить новую версию и подождать некоторое время после ее появления на рынке.
Мой код очень прост:
...

const [initialUrl, setInitialUrl] = useState(null)

...

const handleNavigationStateChange = (navState: any) => {
setCanGoBack(navState.canGoBack)
}

const handleShouldStartLoadWithRequest = (navState: any) => {
if (navState.url && !navState.url.startsWith(targetUrl)) {
if (navState.url.match(/^(https?|mailto|tel|sms|geo):/i)) {
Linking.openURL(navState.url).then()
return false
}
}

return true
}

...

useEffect(() => {
let finalUrl = `${targetUrl}/auth/login`

const checkAndSetUrl = async () => {
const initialLink = await Linking.getInitialURL()

if (initialLink) {
finalUrl = initialLink

console.log('App opened with Deep Link URL:', initialLink)
} else {
try {
const value = await AsyncStorage.getItem(FIRST_LOAD_KEY)

if (value === null) {
finalUrl = `${targetUrl}/auth/start` // Onboarding
await AsyncStorage.setItem(FIRST_LOAD_KEY, 'false')
}
} catch (e) {
console.error('Failed to read/save data:', e)
}
}

setInitialUrl(finalUrl)
}

checkAndSetUrl()

const subscription = Linking.addEventListener('url', ({ url }) => {
setInitialUrl(url)
})

return () => {
subscription.remove()
}
}, [targetUrl])

...

return (



)

Я ожидаю, что URL-адрес будет работать каждый раз, а не только в первый раз. После повторного щелчка по ссылке он должен перейти в указанное место.
ОБНОВЛЕНИЕ
Я сам нашел исправление. Это действительно была проблема реагирования государства. Я добавил параметр метки времени в URL-адрес перед установкой его в обработчике, и теперь он работает каждый раз.
const subscription = Linking.addEventListener('url', ({ url }) => {
const separator = url.includes('?') ? '&' : '?'
const newUrl = `${url}${separator}t=${Date.now()}`

setInitialUrl(newUrl)
})


Подробнее здесь: https://stackoverflow.com/questions/797 ... deep-links
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»