ios – React Native Deep Linking Push Notifications (Using AWS Pinpoint)

0
175


I am trying to set up deep linking for my IOS app using push notifications and can not get notifications to direct a user to a specific screen on a physical device (downloaded via TestFlight).

React Native: 0.66.4
React Navigation: v6

Current Situation

  • Test push notifications through AWS Pinpoint work (they are successfully sent to a device), but will redirect a user to the wrong route (the initial route / home screen) of the application even when using a deep link. The deep link I am passing through AWS Pinpoint is in the form ‘appName://ScreenName’ (without the quotes).
  • The deep link to the page I want the user to go to works, but not as a push notification. For example, if I open Notes on my phone and type ‘appName://ScreenName’ and press the link I will be redirected to the deep link in my app. This convinces me that deep linking is set up properly, maybe I am wrong here?
  • If I hardcode the url scheme I want to use into my app.js file (running in development on a physical device) I am directed to the proper screen.

It appears that deep linking is working but Linking.getInitialURL() is not returning the url scheme from a push notifications. The url scheme works, but not as a push notification, whether the app is running in the background or not.

App.js

  const config = {
    screens: {
      'ScreenName': "ScreenName",
    },
  }

  const linking = {
    prefixes: ['https://appName.com', 'appName://'],
    config,   
  };

  const handleOpenUrl = (event) => {
    if (event && event.url) {
      const route = event.url.replace(/.*?:\/\//g, "")
      if (route?.includes("setmpin")) {
        let { hostname, path, queryParams } = Linking.parse(route)
        const params = path.split("/")[1]
        const listener = Linking.addEventListener(
          "url",
          handleURL(path.split("/")[0], params)
        )
      }
    }   
  }

  useEffect(() => {
    Linking.getInitialURL().then((url) => {
      const supported = Linking.canOpenURL(url)
      if (supported) {
        Linking.openURL(url)
      }
    })
    Linking.addEventListener("url", handleOpenUrl);
    return () => {
      Linking.removeAllListeners("url");
    };   
  }, [])

Questions…

  1. Am I missing anything glaring here, I have read several stackoverflow and similar posts and am not sure what I have missed.
  2. Am I right to believe that deep linking is setup properly since I can test deep links in my Notes app or by hardcoding the url scheme in my App.js file?
  3. Is there a way to validate what url is being passed by Pinpoint? I believe this is what is driving the issue but do not know how I can check this since push notifications only work on my physical device in production.

Thanks! Happy to share any additional information as well…