深层链接 - 如果应用程序关闭则不起作用

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

我正在我的 React Native 应用程序中实现与 expo 的深度链接。我已经成功地使用此代码以及本教程本文档来将其调整为我的嵌套堆栈:

const linking = {
  prefixes:[prefix],
  config: {
    screens: {
      Drawer: {
        screens: {
          Tabs: {
            screens: {
              Profile:"profile"
            }
          }
        }
      },
    }
  }
}
return (
  <NavigationContainer linking={linking}>
    <RootStackScreen actions={actions} showLoader={showLoader} user={user} {...props} />
  </NavigationContainer>
)

}

如果我使用

myscheme://profile
,它会按预期工作,但前提是应用程序在后台打开。当应用程序关闭时,它只是在我的初始主屏幕中打开它,我尝试谷歌搜索和搜索,但找不到任何适合我所做的解释。我还尝试将
getInitialRoute
功能添加到
linking
,该功能在应用程序关闭并从深层链接打开时触发,但不知道如何使用它来激活导航。

async getInitialURL() {
  const url = await Linking.getInitialURL(); // This returns the link that was used to open the app
  if (url != null) {
    //const { path, queryParams } = Linking.parse(url);
    //console.log(path,queryParams)
    //Linking.openURL(url) 
    return url;
  }
  
},
react-native navigation expo deep-linking
6个回答
3
投票

我想您确认您的函数 getInitialURL 在您的应用程序启动时被调用?另外,

if (url != null) {
中的注释代码不应该被注释吗?

如果上述情况正常,则问题可能与启用的调试器有关。根据 React Native 的文档 (https://reactnative.dev/docs/linking#getinitialurl):

启用调试时,

getInitialURL 可能会返回 null。禁用调试器以确保它通过。


2
投票

我遇到了同样的问题,并且执行以下操作对我有帮助

  • 从导航堆栈根部的组件(您可以在其中配置深度链接)添加以下代码:
const ApplicationNavigator = () => {

  
  useEffect(() => {
    // THIS IS THE MAIN POINT OF THIS ANSWER
    const navigateToInitialUrl = async () => {
      const initialUrl = await Linking.getInitialURL()
      if (initialUrl) {
        await Linking.openURL(initialUrl)
      }
    }
    navigateToInitialUrl()
  }, [])

  const linking = {
    prefixes: ['<your_custom_scheme>://'],
    config: {
      /* configuration for matching screens with paths */
      screens: {},
    },
  }

  return (
    // Your components/navigation setup
  )
}

很明显,您的应用程序收到了该网址,但以某种方式“使用”它从后台唤醒应用程序。当它位于前台时,useEffect 运行并使用 URL 导航到预期屏幕。

PS:确保您的链接树与您的应用程序树匹配


1
投票

基于https://documentation.onesignal.com/v7.0/docs/react-native-sdk#handlers

iOS 中应用程序关闭状态下的深度链接

您必须修改 AppDelegate.m 文件中的 application:didFinishLaunchingWithOptions 才能使用以下内容:

NSMutableDictionary *newLaunchOptions = [NSMutableDictionary dictionaryWithDictionary:launchOptions];
    if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
        NSDictionary *remoteNotif = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
        if (remoteNotif[@"custom"] && remoteNotif[@"custom"][@"u"]) {
            NSString *initialURL = remoteNotif[@"custom"][@"u"];
            if (!launchOptions[UIApplicationLaunchOptionsURLKey]) {
                newLaunchOptions[UIApplicationLaunchOptionsURLKey] = [NSURL URLWithString:initialURL];
            }
        }
    }

RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:newLaunchOptions];

也在反应导航中:

https://reactnavigation.org/docs/deep-linking/

const linking = {
    prefixes: ["https://example.com", "example://"],
    config,
    async getInitialURL() {
      const url = await Linking.getInitialURL();
      if (url != null) {
        return url;
      }
    },
  };

<NavigationContainer linking={linking}>
   ...
</NavigationContainer>

0
投票

您可以检查几件事。

  • 验证

    linking.config
    的结构是否与您的导航结构匹配。我过去遇到过类似的问题,并通过确保我的
    config
    结构正确来解决它。

  • 确保

    linking
    对象设置正确。请参阅docs进行验证。从外观上看,您显示的
    linking
    对象中没有
    getInitialURL
    属性。

  • 确认您已将本机部分设置为记录

希望一切顺利!如果没有,请告诉我。 🙂


0
投票

我面临这个问题,因为第一次加载导航为空,所以我添加了超时来导航到深层链接路径:

//helper.ts `让导航;

function setNavigation(navigationRef) {
  navigation = navigationRef;
}

function getNavigation() {
  return navigation;
}

export { setNavigation, getNavigation };

`

//App.tsx:

 useEffect(() => {
    async function getInitialUrl() {
      try {
        const initialUrl = await Linking.getInitialURL();
        if (initialUrl) {
          setData(Linking.parse(initialUrl));
        }
      } catch (error) {
        console.error("Error getting initial :", error);
      }
    }

    const subscription = Linking.addEventListener("url", handleDeeplinkUrl);

    if (!data) {
      getInitialUrl();
    }

    return () => {
      subscription.remove();
    };
  }, [data]); // Add data as a dependency to avoid missing the initial URL



  function handleDeeplinkUrl(event) {
    let data = Linking.parse(event.url);
    setData(data);
    if (data.hostname === "details") {
      let navigation = getNavigation();
      if (!navigation) {
        // If navigation is not available, wait for 500 milliseconds and try again
        setTimeout(() => {
          navigation = getNavigation();
          if (navigation) {
            navigation.navigate("Details", { id: data.path });
          }
        }, 500);
      } else {
        navigation.navigate("Details", { id: data.path });
      }
    }
  }

-1
投票

我也遇到了同样的问题。在 iOS(flutter build)中,我通过添加“可用内容”解决了这个问题。本文位于:Apple 内容可用文档。我正在使用 OneSignal,因此在 api 中我添加了该字段。现在,即使应用程序被强制关闭,它也会醒来并且深层链接可以工作。对于 Onesignal,我必须使用“content_available”:true。完整的 Onesignal 邮递员代码是:

{
  "app_id": "1234",
  "included_segments": ["Test"],
  "content_available" : true,
  "contents": {
                "en": "Hi"
            },
            "data": {
                "dynamic_link": "https://google.com"
            },
            "headings": {
                "en": "Testing"
            }
}
© www.soinside.com 2019 - 2024. All rights reserved.