我已经有两个星期了这个问题。我使用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;
      }
    });

08-18 20:15