Сейчас я разрабатываю приложение 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
React Native с WebView и глубокими ссылками ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1760534964
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)
})
Подробнее здесь: [url]https://stackoverflow.com/questions/79791180/react-native-with-webview-and-deep-links[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия