URL Scheme — est un protocole URI personnalisé qu'une application mobile enregistre dans le système d'exploitation pour être ouvert via des liens comme myapp://path. Selon la RFC 3986, le schéma URI définit la syntaxe et la sémantique de tous les composants suivants de l'adresse. En naviguant vers un tel lien, le système identifie l'application enregistrée par son identifiant unique et la lance avec les paramètres extraits du lien. Le Deep link basé sur URL Scheme reste le mécanisme de base de la navigation inter-applications sur les plateformes mobiles, malgré l'émergence d'alternatives plus modernes.
Points clés
URL Scheme — est un identifiant de protocole unique qu'une application enregistre dans le système d'exploitation pour recevoir des appels via des liens personnalisés. Lorsqu'un utilisateur clique sur un lien comme myapp://profile/123, le système identifie l'application qui a enregistré le schéma myapp et lui transmet le contrôle avec l'URI complet. Ce mécanisme permet aux applications d'échanger des données et de s'ouvrir mutuellement sans nécessiter d'infrastructure serveur.
Le concept d'URL Scheme est directement emprunté aux standards web RFC 3986, où le schéma URI est le premier composant de tout identifiant universel de ressource. Dans le développement mobile, cette idée est adaptée pour la communication inter-applications, où au lieu d'un serveur HTTP, l'application elle-même agit comme gestionnaire de lien.
De nombreuses applications populaires enregistrent leurs propres URL Schemes pour l'intégration avec des services tiers. Par exemple, Spotify utilise le schéma spotify://, Telegram utilise tg://, et Instagram utilise instagram://. Les développeurs créent également souvent des schémas comme appname:// pour la navigation interne et les tests de bout en bout des écrans.
Les URL Schemes sont encore largement utilisés dans les notifications push, les newsletters par e-mail et les codes QR où une navigation instantanée vers une section spécifique de l'application est requise. Cependant, à partir d'iOS 9 et Android 6, des mécanismes alternatifs sont apparus qui complètent et remplacent progressivement les schémas simples.
La structure d'un URI personnalisé suit la spécification générale RFC 3986 et se compose de plusieurs composants. Le schéma est spécifié en premier et séparé par deux-points du reste de l'adresse. Après le schéma peuvent suivre l'hôte, le port, le chemin, les paramètres de requête et le fragment, chacun étant optionnel.
La syntaxe complète ressemble à scheme://host/path?key=value#fragment. Le schéma est le seul élément obligatoire ; le reste est déterminé par les besoins de l'implémentation spécifique. La double barre après le schéma est historiquement empruntée à HTTP et n'est pas strictement obligatoire selon la spécification, mais est universellement utilisée comme convention.
Pour une représentation visuelle de la structure de l'URI, un tableau de composants est utilisé. Chaque élément a son objectif et son niveau d'obligation.
| Composant | Exemple | Obligatoire |
|---|---|---|
| Scheme | myapp | Oui |
| Host | profile | Non |
| Path | /user/42 | Non |
| Query | ?id=42&tab=main | Non |
| Fragment | #section2 | Non |
Les développeurs peuvent choisir arbitrairement la structure de l'URI, ce qui crée de la flexibilité mais génère des problèmes de compatibilité entre différentes versions de l'application. Il est recommandé de documenter le format URL Scheme dans le cadre de l'API publique de l'application et de le versionner lors des modifications.
iOS exige un enregistrement explicite de chaque URL Scheme dans le fichier Info.plist du projet. Le développeur ajoute un tableau CFBundleURLTypes, dont chaque élément contient un identifiant (CFBundleURLName) et une liste de schémas pris en charge (CFBundleURLSchemes). Après l'enregistrement, le système dirige automatiquement tous les appels entrants sur les schémas enregistrés vers l'application.
Le traitement d'un URL Scheme entrant s'effectue dans le délégué de l'application via la méthode application(_:open:options:). Cette méthode reçoit un objet URL dont le chemin et les paramètres de requête sont extraits pour prendre des décisions de navigation. Le gestionnaire doit retourner une valeur Bool indiquant le succès de l'opération.
Voici un exemple d'implémentation d'un gestionnaire URL Scheme en Swift. Le code démontre l'extraction de l'hôte et des paramètres de requête d'un URI entrant à l'aide d'URLComponents.
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any]
) -> Bool {
let host = url.host
let params = URLComponents(
url: url,
resolvingAgainstBaseURL: false
)?.queryItems
if host == "profile" {
navigateToProfile(params)
}
return true
}
La méthode utilise URLComponents pour une analyse sécurisée des paramètres de requête. Cette approche est préférable à l'analyse manuelle de chaînes car elle gère automatiquement l'encodage en pourcentage et le décodage des caractères spéciaux dans les valeurs des paramètres.
Android utilise le système Intent Filter pour acheminer les deep links basés sur URL Scheme. Le développeur déclare un filtre dans AndroidManifest.xml à l'intérieur de la balise Activity qui doit traiter le lien. Le filtre contient l'action VIEW, les catégories BROWSABLE et DEFAULT, et une balise data spécifiant le schéma, l'hôte et pathPrefix.
Lorsqu'un utilisateur clique sur un lien avec un schéma personnalisé, le système vérifie l'Intent Filter de toutes les applications installées. Si plusieurs applications correspondantes sont trouvées, une boîte de dialogue de sélection est présentée à l'utilisateur. La catégorie BROWSABLE permet le traitement du lien depuis le navigateur.
Exemple de déclaration d'Intent Filter dans AndroidManifest.xml pour traiter le schéma myapp sur une Activity. La combinaison de action et category est obligatoire pour un routage correct des deep links.
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="myapp"
android:host="profile"
android:pathPrefix="/user" />
</intent-filter>
</activity>
Après avoir configuré le filtre dans l'Activity, il faut appeler intent.getData() pour obtenir l'URI. Il est important de vérifier intent et les données pour null, car l'Activity peut être lancée sans deep link entrant, par exemple lors d'un démarrage standard depuis le lanceur.
Les paramètres de requête dans URL Scheme sont passés après le point d'interrogation au format clé=valeur, séparés par une esperluette. Ce format est identique aux requêtes HTTP et est facilement traité par les outils standard de la plateforme. Les paramètres doivent être encodés à l'aide d'un encodage en pourcentage pour tous les caractères ne faisant pas partie de l'ensemble autorisé des caractères URI.
Exemple d'un lien complet avec paramètres : myapp://profile?userId=42&source=email&ref=abc123. Après extraction de l'URL, l'application analyse séquentiellement tous les query-items et en fonction de leurs valeurs prend une décision de navigation vers l'écran cible.
Lors du passage de données complexes, il est important de considérer la limitation de longueur de l'URI. Sous iOS, la longueur maximale d'URL Scheme est limitée à 2 Ko, après quoi le système tronque le lien. Sous Android, la limite est d'environ 8 Ko, mais la valeur exacte dépend de la version du système d'exploitation et du fabricant de l'appareil. Pour de grands volumes de données, il est recommandé de passer uniquement un identifiant de session via URL Scheme et de charger le reste des données depuis le serveur.
Le principal inconvénient d'URL Scheme est l'incapacité de traiter un lien si l'application n'est pas installée sur l'appareil. Le navigateur affiche une erreur et l'utilisateur perd le contexte de navigation. Pour résoudre ce problème, Apple a introduit Universal Links dans iOS 9 et Google a introduit App Links dans Android 6. Les deux mécanismes sont enregistrés via un domaine web associé à l'application.
Universal Links et App Links fonctionnent comme des liens HTTPS normaux, mais lorsque l'application est installée, ils l'ouvrent sans boîte de dialogue de sélection. Si l'application n'est pas installée, le lien ouvre une page web sur le même domaine, préservant l'expérience utilisateur. Cela en fait l'alternative préférée pour les environnements de production.
Pour URL Scheme sur iOS et Android, il n'existe pas de mécanisme de fallback intégré. Les développeurs utilisent des solutions intermédiaires sur serveur : le lien mène à une page web qui vérifie si l'application est installée via JavaScript et redirige soit vers le schéma, soit vers la boutique d'applications. Firebase Dynamic Links et Branch.io offrent des solutions prêtes à l'emploi pour ce problème avec prise en charge des deferred deep links qui déterminent automatiquement le statut d'installation et acheminent l'utilisateur sans nécessiter le développement d'un pipeline serveur personnalisé.
Une complexité supplémentaire survient lors de l'utilisation d'URL Scheme sur iOS 15+ et Android 12+, où les règles de confidentialité ont été renforcées. Safari bloque les tentatives d'ouverture d'un schéma non enregistré sans confirmation préalable, et Android 12 limite la visibilité des applications installées via PackageManager. Ces changements rendent l'utilisation d'URL Scheme pour la communication inter-applications moins fiable que dans les versions antérieures des plateformes.
Foire aux questions
URL Scheme utilise un protocole personnalisé sans chiffrement, tandis que Universal Links fonctionnent via HTTPS avec vérification de domaine. Universal Links n'affichent pas de boîte de dialogue de sélection d'application et sont traités correctement lorsque l'application n'est pas installée sur l'appareil.
Oui, mais tous les caractères non ASCII doivent être encodés à l'aide de l'encodage en pourcentage selon la RFC 3986. Il est recommandé d'éviter le cyrillique dans URL Scheme pour garantir la compatibilité avec les anciennes versions du système d'exploitation et les navigateurs.
Il n'y a pas de limite sur le nombre de schémas ni dans iOS ni dans Android. En pratique, les applications utilisent entre un et cinq schémas. Par exemple, Telegram enregistre les schémas tg://, t.me/, telegram:// et telegram.me://.
Sous iOS, la méthode canOpenURL(_:) est utilisée, qui retourne true si le schéma est enregistré. Sous Android, la vérification s'effectue via PackageManager.queryIntentActivities(). Les deux plateformes exigent que le schéma soit pré-spécifié dans la configuration.
Non, URL Scheme ne chiffre pas les données. Toute application enregistrant le même schéma peut intercepter le lien. Pour la sécurité, utilisez des Universal Links avec HTTPS ou un chiffrement de bout en bout au niveau du protocole.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi