我有一个反应本机应用程序,在主屏幕上我有打开深层链接的代码。我使用
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()
},[])
您正在使用 useEffect() 并且在您配置它时它可能会在您加载主屏幕时触发 - 请使用一些日志验证相同的情况。
一般来说,我不会在 useEffect 块中指定函数,而是使用 const 和
useState()
来存储链接状态。然后你可以将相同的内容放在 useEffect 的 [linkState]
括号中,这样 useEffect 只会在 linkState 更改时触发。
此外,您在这里使用深层链接工作,那么我宁愿在导航中拥有相同的代码
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-handler
useEffect(() => {
Linking.addEventListener('url', handleOpenURL);
},[])
const handleOpenURL = (_url) => {
console.log(_url)
// open the URL
}