У меня была эта проблема около 2 недель.Я использовал Wix's Navigation для навигации по приложению.Я следовал этому уроку для реализации Deeplink / Universal Link.
У меня есть базовый класс с именем 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
, но он не вызывается.Я не знаю, пропустил ли я что-то.
Спасибо за ваше время.Любая идея будет оценена