Aller au contenu
useffect.sh
Planifier 30 min avec un senior
Interface

Deep linking

Ouvrir un écran précis de l’app depuis une URL : schéma custom (monapp://) ou lien https vérifié (universal links, App Links).

Définition

Le deep linking consiste à ouvrir une app React Native directement sur un écran donné à partir d’une URL, depuis un e-mail, une notification, un site web ou une autre app. Deux familles coexistent : les schémas d’URL custom (monapp://commande/42), que l’OS route vers l’app sans vérification mais qui ne font rien si l’app n’est pas installée, et les liens https standards associés à l’app par une preuve côté serveur (universal links sur iOS, App Links sur Android), qui tombent sur le site web en l’absence de l’app. Côté code, l’API Linking de React Native expose deux cas : Linking.getInitialURL() quand l’app est lancée par un lien, et l’événement url quand elle est déjà ouverte. Expo Router rend chaque écran accessible par deep link automatiquement ; React Navigation demande une configuration linking. Une notification push qui ouvre l’app sur l’accueil au lieu de la commande concernée est un bug de deep linking.

Dans une vraie app

Dans un projet Expo, le schéma custom se déclare avec scheme dans app.json, et prebuild l’injecte dans Info.plist (CFBundleURLTypes) et dans l’intent filter de AndroidManifest.xml. Sans prebuild, il faut faire ces deux ajouts à la main, plus le forwarding vers RCTLinkingManager dans AppDelegate sur iOS, ou dans SceneDelegate depuis React Native 0.88. Sur Android, android:launchMode="singleTask" sur MainActivity évite d’empiler une nouvelle instance de l’app à chaque lien.

Les bugs se concentrent sur le cas « app fermée » : l’URL initiale est lue une fois, souvent avant que la navigation soit montée, et un écran de splash ou d’authentification peut l’avaler. Il faut un point unique qui stocke l’URL en attente, puis navigue quand l’arbre est prêt. Avec Expo Router, ce comportement est géré ; avec React Navigation, linking.getInitialURL et subscribe sont les bons points d’accroche. Autre classique : canOpenURL qui renvoie toujours false sur iOS parce que le schéma interrogé n’est pas listé dans LSApplicationQueriesSchemes, et sur Android 11 et plus parce que les <queries> manquent dans le manifest.

Pour tester : npx uri-scheme open monapp://commande/42 --ios, ou xcrun simctl openurl booted et adb shell am start -W -a android.intent.action.VIEW -d. Je demande une matrice de test : lien custom et lien https, app fermée, en arrière-plan et au premier plan, sur les deux plateformes.

Sources

Les 35 termes du glossaire

Un de ces sujets bloque votre app ?

30 minutes avec un senior pour regarder le problème dans votre code. Gratuit.