Linking.getInitialURL () не очищается после использования для deeplink - PullRequest
0 голосов
/ 19 октября 2018

У меня была эта проблема около 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, но он не вызывается.Я не знаю, пропустил ли я что-то.

Спасибо за ваше время.Любая идея будет оценена

1 Ответ

0 голосов
/ 31 октября 2018

Linking.getInitialURL () дает нам тот же URL-адрес, когда мы снова возвращаемся на ту же страницу, чтобы преодолеть это, мы можем сделать простое условие - не вызывать функцию DeepLink.Что-то вроде ...

Шаг 1: Сначала инициализируйте строку dummyDeepLinkedUrl.

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;
      }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...