Как получить глубокую ссылку на указанный экран c на выставке - PullRequest
1 голос
/ 29 марта 2020

Я создаю URL ссылки со следующим кодом:

Linking.makeUrl('lobby/', {
  roomId: params.roomId
})

, который выводит следующее: exp://192.168.0.31:19000/--/lobby/?roomId=1585512451

Это прекрасно работает локально, но, кажется, открывается только на домашней странице моего приложения.

Я определил экраны в Моем приложении. js

const Stack = createStackNavigator();

function App() {  
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen 
          name="Home" 
          component={HomeScreen} 
        />
        <Stack.Screen 
          name="Lobby"
          component={LobbyScreen} 
        />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

Нужно ли перенаправлять на экран лобби с каким-то ровным слушателем или путь перешли в makeUrl карту на экран?

1 Ответ

1 голос
/ 29 марта 2020

Да, вам нужно прослушивать события URL. Смотрите раздел в документации Экспо о глубоких ссылках. https://docs.expo.io/versions/latest/workflow/linking/#handling -links-into-your-app

Обратите внимание, что в конфигурации expo вам понадобятся дополнительные параметры конфигурации для работы на разных устройствах. См. В своей документации все инструкции на этот счет.

Цитируется по предоставленной ссылке

Handling links into your app
There are two ways to handle URLs that open your app.

1. If the app is already open, the app is foregrounded and a Linking event is fired
You can handle these events with Linking.addEventListener('url', callback).

2. If the app is not already open, it is opened and the url is passed in as the initialURL
You can handle these events with Linking.getInitialURL -- it returns a Promise that resolves to the url, if there is one.

Из кода их примера:

let redirectUrl = Linking.makeUrl('path/into/app', { hello: 'world', goodbye: 'now' });

Затем вам нужно обработать URL-адрес с помощью обработчика событий

_handleUrl = url => {
  this.setState({ url });
  let { path, queryParams } = Linking.parse(url);
  alert(`Linked to app with path: ${path} and data: ${JSON.stringify(queryParams)}`);
};

Поскольку поведение, если ваше приложение открывается и щелкает ссылку, а приложение закрывается, вам нужно 2 разных точки входа для обработки ссылки.

Внутри вашего HomeScreen компонента вы можете поместить что-то вроде этого:

    componentDidMount() {
        // handle an initial url on app opening
        Linking.getInitialURL().then(urlRedirect)
    }

И где-нибудь в вашем приложении, возможно, в app.js поместите обработчик для новых URL из приложения.

function urlRedirect(url) {
    if(!url) return;
    // parse and redirect to new url
    let { path, queryParams } = Linking.parse(url);
    console.log(`Linked to app with path: ${path} and data: ${JSON.stringify(queryParams)}`);
    this.navigation.replace(path, queryParams);
}

// listen for new url events coming from Expo
Linking.addEventListener('url', event => {
    urlRedirect(event.url);
});

...