我已经有两个星期了这个问题。我使用Wix's Navigation浏览该应用程序。我遵循this tutorial实现了Deeplink / Universal链接。
我有一个名为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
。终止应用程序后,单击邮件中的URL,应用程序首先启动LoginScreen
,然后将其重定向到屏幕NewPassword
,并且在完成所有操作后,我将通过以下方式重定向回LoginScreen
:this.props.navigator.resetTo({
screen: 'LoginScreen',
animated: true,
overrideBackPress: true,
animationType: 'fade',
navigatorStyle: {
navBarHidden: true,
}
})
但是
Linking.getInitialURL()
的LoginScreen
仍然收到旧网址,因此它将再次重定向到NewPassword
,这是一个循环。我还尝试通过:
passProps: {}
的resetTo
选项,但没有运气。我猜想解决此问题的唯一方法是在
LoginScreen
屏幕中完成所有操作后手动清除initialUrl。 NewPassword
的侦听器应该存在,因为如果我不杀死应用程序(只是将其最小化),则侦听器应该正在运行以导航至BaseScreen
。Wix的导航中有一个适用于Deeplink的文档,我尝试将
NewPassword
方法放入onNavigatorEvent(event)
中,但未被调用。我不知道我是否想念什么。感谢您的时间。任何想法将不胜感激
最佳答案
再次返回同一页面时,Linking.getInitialURL()为我们提供了相同的网址,要克服这一点,我们可以做一个简单的条件,即不调用DeepLink函数。就像是...
步骤1:首先初始化一个dummyDeepLinkedUrl String。
var dummyDeepLinkedUrl;
步骤2:检查是否存在类似条件,例如deeplinkUrl是否来自Linking.getInitialURL()并且deeplinkUrl不等于dummyDeepLinkedUrl。
if (url && url != dummyDeepLinkedUrl) {}
步骤3:如果不相同,则调用Deeplink函数,并将deeplinkUrl分配给dummyDeepLinkedUrl。
this.navigateToRespectivePage(url);
dummyDeepLinkedUrl = url;
最后,这看起来像:
Linking.getInitialURL().then(url => {
if (url && url != dummyDeepLinkedUrl) {
this.navigateToRespectivePage(url);
dummyDeepLinkedUrl = url;
}
});