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

Universal links et App Links

Des liens https ordinaires qui ouvrent l’app quand elle est installée, prouvés par un fichier hébergé sur votre domaine (AASA, assetlinks.json).

Définition

Les universal links (iOS) et les App Links (Android) sont des liens https ordinaires qui ouvrent directement l’app lorsqu’elle est installée, et le site web sinon. Contrairement à un schéma custom, l’association est vérifiée : le domaine héberge un fichier qui déclare quelles apps ont le droit de capter quels chemins. Sur iOS, c’est apple-app-site-association à la racine ou sous /.well-known/, servi en https, avec l’identifiant TEAMID.bundleId ; l’app déclare le domaine dans l’entitlement Associated Domains (applinks:exemple.com). Sur Android, c’est /.well-known/assetlinks.json, servi en application/json, qui liste le nom de package et les empreintes SHA-256 des certificats de signature ; l’app déclare un intent filter avec autoVerify. Ils remplacent les schémas custom pour tout ce qui part d’un e-mail, d’un SMS ou d’une page web, où un lien monapp:// ouvert sur un ordinateur ne fait rien. Vous les rencontrez dès qu’un lien partagé doit fonctionner avec ou sans l’app.

Dans une vraie app

Avec Expo, ios.associatedDomains (["applinks:exemple.com"], sans protocole, l’erreur la plus fréquente) et android.intentFilters (avec autoVerify: true) dans app.json suffisent côté app ; EAS Build enregistre l’entitlement auprès d’Apple. Sans EAS ni prebuild, il faut activer la capability Associated Domains dans Xcode et l’entitlement com.apple.developer.associated-domains. Les empreintes Android s’obtiennent avec eas credentials -p android ou dans la Play Console (App Signing), et il en faut une par variante de signature : debug, release locale, Play App Signing.

Le piège iOS tient au cache : le système télécharge l’AASA à l’installation ou à la mise à jour de l’app, via le CDN d’Apple, et ne le rafraîchit pas souvent. Un changement de chemins en production demande donc une nouvelle version sur l’App Store, et un fichier AASA cassé le jour de la sortie reste cassé pour les utilisateurs qui ont installé ce jour-là. Le fichier doit faire moins de 128 ko décompressé et le joker * ne traverse ni les points ni les slashs. Sur Android, la vérification tourne après l’installation et peut prendre une vingtaine de secondes ; adb shell pm get-app-links <package> montre son état.

Je vérifie les deux fichiers avec curl -I (code 200, pas de redirection, bon content-type), que les chemins déclarés correspondent aux routes réelles d’Expo Router, et que la page web de repli existe pour chaque chemin, parce qu’un universal link sans page web est un lien mort pour tous ceux qui n’ont pas l’app.

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.