打开后如何清除深层链接



我有一个react原生应用程序,在主屏幕上我有打开深度链接的代码。我使用Linking.getInitialURL()检查深度链接是否存在,然后如果initialUrl存在,我重定向用户,这个流工作正常,但深度链接不会被清除。

例如,如果我点击深度链接myapp://home/gallery它会把我带到Gallery屏幕。当我点击Gallery屏幕上的Go Home按钮时,我会转到Home screen。但是Linking.getInitialURL()检测到myapp://home/gallery链接agan并将用户重定向回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()
},[])

您正在使用useEffect((,当您配置它时,它可能会在加载主屏幕时触发-请用一些日志验证这一点。

通常,我不会在useEffect块中指定函数,而是使用带有useState()的常量来存储链接的状态。然后,您可以将其放在useEffect中的[linkState]括号中,因此useEffect仅在链接状态发生更改时才会激发。

此外,如果您在这里使用深度链接,那么我宁愿在导航index.js中有相同的代码。这将使你避免任何像你所面临的副作用。

也许在您的情况下,您可以将链接存储在中心状态(如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()
},[])

将链接存储在useState中不适用于我的用例,因为我需要用户连续点击链接两次。

所以我找到了一种方法,用Linking.openURL()替换URL,并用它更改URL。之后不处理新的URL

我最近遇到了类似的问题,您可以通过使用Linking.addEventListener('url', handleOpenURL);来获得这种行为。

只有当用户点击外部链接时才会触发该事件,而当应用程序"关闭"时不会调用该事件;"活动";。

https://docs.expo.dev/versions/latest/sdk/linking/#linkingaddeventlistenertype-处理机

useEffect(() => {
Linking.addEventListener('url', handleOpenURL);
},[])
const handleOpenURL = (_url) => {
console.log(_url)
// open the URL
}

相关内容

  • 没有找到相关文章

最新更新