Android Глубокая связь с React Navigation 5 - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь внедрить Глубокие ссылки в React Navigation 5 в мой проект React Native 0.61, который был создан с помощью init-native init.

Когда приложение работает в фоновом режиме, глубокая связь работает. На моем устройстве Android я могу нажать https://myproject.com/content/5, и приложение правильно перейдет в раздел контента и отобразит контент с идентификатором 5.

Однако, если я убью приложение (или установите его, не открывая его) и нажмите на ту же ссылку, по которой я перехожу на домашнюю страницу вместо перехода на соответствующую страницу содержимого.

Активность в моем AndroidManifest. xml:

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="http" />
        <data android:scheme="https" />
        <data android:host="myproject.com"/>
    </intent-filter>
</activity>

Мясо и картофель приложения. js:

const config = {
  Content: {
    path: "content/:id",
    parse: {
      id: Number
    }
  }
};


const App = () => {
  const {state} = useContext(Context);
  const ref = React.useRef();

  const { getInitialState } = useLinking(ref, {
    prefixes: ['http://myproject.com'],
    config
  });

  const [isReady, setIsReady] = React.useState(false);
  const [initialState, setInitialState] = React.useState();

  useEffect(() => {
    Promise.race([
      getInitialState(),
      new Promise(resolve => setTimeout(resolve, 150)),
    ])
    .catch(e => {
      console.error(e);
    })
    .then(state => {
      if (state !== undefined) {
      setInitialState(state);
    }

    setIsReady(true);
    });
  }, [getInitialState]);

  return (
    <NavigationContainer initialState={initialState} ref={ref} >
      {state.isLoading || !isReady ? 
      (
        <Stack.Navigator screenOptions={{headerShown: false}}>
          <Stack.Screen name="Loading" component={LoadingScreen} />
        </Stack.Navigator>
      )
      :
      <MainStack />
      }
    </NavigationContainer>
  );
};

Что нужно сделать, чтобы приложение переместилось на страницу содержимого, когда пользователь Android открывает приложение с помощью глубокая ссылка, когда приложение ранее было убито?

Я также хотел бы сохранить текущее поведение глубоких ссылок, когда глубокая ссылка работает, когда приложение находится в фоновом режиме.

Проблема также объясняется здесь , но ни одно из предложенных решений не помогло мне.

1 Ответ

1 голос
/ 15 апреля 2020

Ваш навигатор имеет динамическое c переключение маршрутов, поэтому вам нужно сначала обработать все логи переключения c, а затем визуализировать навигатор, как только приложение будет готово. В настоящее время ваш навигатор игнорирует переключение initialState и dynamici c, которое переопределяет отображаемый маршрут.

Попробуйте переместить состояние загрузки за пределы навигатора или определите, готово ли приложение отображать навигатор в effect ,

...