React Native Expo / Deep Linking / Universal Link
Asked Answered
C

1

6

I am building app using react native, Expo SDK - 41 & react-native-navigation - v5 that serves items to the users

How can I create links to be shared between users through social media apps like "WhatsApp" or "Facebook" as messages

For Example:

I found this item on "App Name". Take a look, https://myApp/itemId

When the user press the link it will open the app on specific screen to show that item (if the app installed on the receiver device), Otherwise will open the App store (Android or IOS) depend on the device to download and install the app.

And is there is any tutorial that explain the whole implementation for this feature ?

Cecil answered 16/6, 2021 at 12:54 Comment(1)
Same problem here. Any solutions?Coarsegrained
E
9

Here are the steps I used in our app:

For the steps below let's assume you own a domain https://example.com and you want to redirect all clicks on https://example.com/your-path/ to:

  • redirect to the app/play store if the app is not installed
  • opened in the browser if on a desktop device
  • open the app on iOS/Android if app is installed

Steps to achieve that:

  1. You need a domain (e.g. https://example.com)
  2. Registering Universal Links on iOS:
    You have to prove to Apple that you own this domain by providing an Apple App Site Association (AASA) file from your web server.
    Detailed explanation: https://docs.expo.dev/guides/linking/#universal-links-on-ios. Note: No server-sided configuration needed for Android
  3. After that you need to configure the domains (you specified in the AASA) in your expo app.json file (See: https://docs.expo.dev/guides/linking/#expo-configuration)
    Note: The Expo docs don't show any example so I'll share one:
"expo": {
    "name": "MyApp",
     ...,
       "ios": {
        ...,
      "associatedDomains": [
        "applinks:example.com"
      ]
    },
    "android": {
      ...,
      "intentFilters": [
        {
          "action": "VIEW",
          "autoVerify": true,
          "data": [
            {
              "scheme": "https",
              "host": "*.example.net",
              "pathPrefix": "/your-path"
            }
          ],
          "category": [
            "BROWSABLE",
            "DEFAULT"
          ]
        }
      ]
    }
  }
}
  1. Result of the steps above: if you click a link like https://example.com/your-path/ (or any subdomain of that e.g. https://example.com/your-path/your-second-path?hello=world ...),
    you should be redirected to the app on iOS/Android if the apps are installed.
    However if the app is not installed a browser widow opens https://example.com/your-path/
  2. Redirecting to app stores:
    You have to configure the subdomain .../your-path in a way to check which device is trying to open it when loading the site and redirect to the app store/play store - url if it is an iOS/Android device resp.
    Example: in our case the domain leads to a React web app and on loading the page ( on componentDidMount ) I check User's device using navigator.userAgent
    This will of course differ from framework to framework.
    Here you can also choose what to show or where to redirect if the link is clicked on a desktop device.
  3. Handle links in your iOS/Android app:
    Now in Expo you need to install expo-linking via expo install expo-linkingand set a listener to handle URL links in the desired component:
import * as Linking from 'expo-linking';

componentDidMount() {
 this.grabLinkOpeningApp()
 this.setLinkListenerWhenOpeningApp()
}

grabLinkOpeningApp() {
  //Handles link when the link is clicked and the app was already open
  Linking.addEventListener('url',this.handleUrl)
}

setLinkListenerWhenOpeningApp() {
  //Handles link when app is closed:
  Linking.getInitialURL()
  .then(url => this.handleUrl(url))
  .catch(err => this.handleError(err))
}


handleUrl(url) {
  //Handle your link here
}

Note: Best to use the code in a component that is opened before the actual screen components. In this case you can catch the link no matter if the user is registered or not and like that it can "survive" the registration process.
7. Create a link and share it from your app:
You can add arbitrarily many query params to the link, i.e. .../you-path/key1=value1/key2=value2.... So you can create links within your app using data however you need it for your specific use case.
If you want to share the link via the typical share dialog where the user can choose the app you he wants to share the link with (i.e. Whatsapp, Facebook, Instagram, etc.), you can either import {Share} from 'react-native' or import * as Sharing from 'expo-sharing' (see resp. expo docs, this part is very straight forward following the docs)

In the end, sorry for the long text, but I hope it explains the steps involved well.

Extraditable answered 26/4, 2022 at 20:24 Comment(3)
Thanks a lot! One question, I'm doing all of commented above and doing eas build but it seems to not work all my updates in my standalone app. Should I renew certificates or something?Fascista
what is difference in "host": "*.example.net",? why is it ending on .net and not .com?Pathan
@mksquadizzle would it be possible to share the source code of it? i am following your description but it's not working, seeing the source code would help me a lot :)Cardsharp

© 2022 - 2024 — McMap. All rights reserved.