Наконец это будет выглядеть так:
я была эта проблема в течение 2 недель. я использовалWix's Navigation для навигации по приложению. Я последовал заэтот урок для реализации Deeplink / универсальная ссылка.
У меня есть базовый класс под названиемBaseScreen
где я храню все обработчики DeepLink, как в учебнике. ЭтотBaseScreen
будет выглядеть так:
componentDidMount(){
// this handles the case where the app is closed and is launched via Universal Linking.
Linking.getInitialURL()
.then((url) => {
if (url) {
// Alert.alert('GET INIT URL','initial url ' + url)
this.resetStackToProperRoute(url)
}
})
.catch((e) => {})
// This listener handles the case where the app is woken up from the Universal or Deep Linking
Linking.addEventListener('url', this.appWokeUp);
}
componentWillUnmount(){
// Remove the listener
Linking.removeEventListener('url', this.appWokeUp);
}
appWokeUp = (event) => {
// this handles the use case where the app is running in the background and is activated by the listener...
// Alert.alert('Linking Listener','url ' + event.url)
this.resetStackToProperRoute(event.url)
}
resetStackToProperRoute = (url) => {
// grab the trailing portion of the url so we can use that data to fetch proper information from the server
let trailing = url.slice(url.lastIndexOf('=') + 1, url.length)
// go to the desired screen with the trailing token grabbed from the url
this.props.navigator.resetTo({
screen: 'NewPassword',
overrideBackPress: true,
passProps: {
token: trailing
},
animated: true,
animationType: 'fade',
navigatorStyle: {
navBarHidden: true,
}
})
}
Когда приложение запустится, оно покажет экранLoginScreen
который расширяетBaseScreen
выше. Убив приложение, нажмите на ссылку в письме, приложение запуститсяLoginScreen
сначала он будет перенаправлен на экранNewPassword
и после того, как все будет сделано, я перенаправлю обратно наLoginScreen
по:
this.props.navigator.resetTo({
screen: 'LoginScreen',
animated: true,
overrideBackPress: true,
animationType: 'fade',
navigatorStyle: {
navBarHidden: true,
}
})
НоLinking.getInitialURL()
изLoginScreen
все равно получите старый URL, поэтому он будет перенаправлен наNewPassword
снова, и это петля.
Я также пытался передать:passProps: {}
вариант когдаresetTo
LoginScreen
но не повезло.
Я думаю, что единственный способ исправить это - очистить initialUrl вручную после того, как все сделано вNewPassword
экран. Слушатель дляBaseScreen
должен быть там, потому что если я не убью приложение (просто сверну его), слушатель должен быть запущен, чтобы перейти кNewPassword
.
Навигация Wix имеет документ для Deeplink, я попытался положить методonNavigatorEvent(event)
вBaseScreen
но это не называется. Я не знаю, что я что-то пропустил.
Спасибо за уделенное время. Любая идея будет оценена