深层链接打开后如何清除?

问题描述 投票:0回答:4

我有一个反应本机应用程序,在主屏幕上我有打开深层链接的代码。我使用

Linking.getInitialURL()
检查深层链接是否存在,然后如果初始Url 存在,则重定向用户,此流程工作正常,但深层链接不会被清除。

例如,如果我点击深层链接 myapp://home/gallery 它会将我带到图库屏幕。当我单击图库屏幕上的“返回主页”按钮时,我会转到主屏幕。但是

Linking.getInitialURL()
再次检测到 myapp://home/gallery 链接并将用户重定向回图库屏幕。仅在此之后,如果我进入主屏幕,initialUtl 为空。第一次打开链接后如何清除
Linking.getInitialURL()
,为什么react-native没有检测到它?

我尝试在每次屏幕聚焦时检查

Linking.getInitialURL()
(通过刷新屏幕),但仍然
Linking.getInitialURL()
在用户第一次从图库回家时返回深层链接。

如有任何帮助和建议,我们将不胜感激。

编辑(添加代码)

// Home screen

useEffect(()=> {

const getLink = async () => {

const link = Linking.getInitialURL()

if (link){
await Linking.openURL(url)}
}

getLink()
},[])
android ios reactjs react-native deep-linking
4个回答
0
投票

您正在使用 useEffect() 并且在您配置它时它可能会在您加载主屏幕时触发 - 请使用一些日志验证相同的情况。

一般来说,我不会在 useEffect 块中指定函数,而是使用 const 和

useState()
来存储链接状态。然后你可以将相同的内容放在 useEffect 的
[linkState]
括号中,这样 useEffect 只会在 linkState 更改时触发。

此外,您在这里使用深层链接工作,那么我宁愿在导航中拥有相同的代码

index.js
。这将使您避免像您所面临的任何副作用。


0
投票

也许在你的情况下,你可以将链接存储在中央状态(如redux),并将即将打开的链接与中央状态的链接进行比较。

另外,我认为 RN 建议在打开链接之前使用 canOpenURL 检查链接。

类似这样的事情

const { centrallyStoredDeepLink } = someCentralStore;

// Home screen

useEffect(()=> {

const getLink = async () => {

const link = Linking.getInitialURL()

if (link && link !== centrallyStoredDeeplink && (await Linking.canOpenURL(link)){
centrallyStoredDeepLink = link; //You'll have to use your stores code for setting here
await Linking.openURL(url)}
}

getLink()
},[])

0
投票

将链接存储在 useState 中对我的用例不起作用,因为我需要用户可以连续单击链接两次。

所以我找到了一种方法,使用

Linking.openURL()
替换 URL 并用它更改 URL。之后不处理新的 URL


0
投票

希望还不算太晚,我最近遇到了类似的问题,您可以通过使用 Linking.addEventListener('url', handleOpenURL);

来获得该行为

https://docs.expo.dev/versions/latest/sdk/linking/#linkingaddeventlistenertype-handler

useEffect(() => {
   Linking.addEventListener('url', handleOpenURL);
},[])

const handleOpenURL = (_url) => {
  console.log(_url)
  // open the URL
}
© www.soinside.com 2019 - 2024. All rights reserved.