我有一个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
}