如何在本机博览会中深度链接到特定屏幕

时间:2020-03-29 20:12:20

标签: javascript react-native expo deep-linking

我正在使用以下代码创建链接URL:

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

其输出以下内容:exp://192.168.0.31:19000/--/lobby/?roomId=1585512451

这在本地可以正常使用,但似乎只能在我的应用程序的主页上打开。

我已经在My app.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 个答案:

答案 0 :(得分:3)

是的,您需要监听url事件。请参阅Expo文档中有关深层链接的部分。 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中,放置一个用于从应用程序内部获取新网址的处理程序。

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);
});

相关问题