Créer des liens profonds

Les liens profonds vous permettent de rediriger les utilisateurs directement vers votre application à partir de navigateurs Web, de notifications, de réseaux sociaux, d'annonces et d'autres sources. Les liens profonds permettent des transitions directes d'application à application et du Web à une application. Ils peuvent vous aider à augmenter l'engagement grâce à des contenus contextuels et ciblés.

Ce guide explique le fonctionnement du lien profond, et comment créer et tester des liens profonds vers vos contenus.

Pour les liens profonds qui font référence à votre propre site Web ou à vos domaines, nous vous recommandons d'utiliser les liens d'application, qui offrent une expérience fluide et fiable à vos utilisateurs.

Fonctionnement des liens profonds

L'association directe est une fonctionnalité système générale d'Android, compatible avec toutes les versions et sur tous les appareils. Il tire parti du système d'intentions d'Android pour rediriger les liens profonds vers les applications concernées. Les applications qui souhaitent gérer un URI de lien profond spécifique déclarent un filtre d'intent correspondant dans leurs fichiers manifestes.

Lors de l'exécution, lorsque l'utilisateur appuie sur un lien, Android déclenche un intent et tente de le rediriger vers une application. Étant donné que plusieurs applications peuvent déclarer des filtres d'intent correspondant à un URI donné, Android effectue les actions suivantes, dans cet ordre, pour rediriger l'intent :

  1. Ouvrez l'application par défaut de l'utilisateur qui peut gérer l'URI, si une application a été désignée.
  2. Ouvrez la seule application disponible pouvant gérer l'URI.
  3. Permettez à l'utilisateur de sélectionner une application dans une boîte de dialogue de sélection.

Cela signifie que, même si vos filtres d'intent correspondent à un URI donné, il n'est pas garanti que le système route l'intent de lien profond vers votre application. L'utilisateur joue un rôle clé dans la gestion de l'application qui gère l'intent, ce qui lui donne le contrôle et lui offre un choix. Pour mieux contrôler les liens profonds vers votre propre site Web et vos domaines, essayez d'utiliser les liens d'application.

La boîte de dialogue de désambiguïsation d'Android permet à l'utilisateur de voir toutes les applications installées qui se sont enregistrées pour gérer une intention de lien profond. L'utilisateur peut également sélectionner une application comme application par défaut pour ce type de lien. Une fois que l'utilisateur a défini une application par défaut, le système n'affiche plus la boîte de dialogue pour cette intention spécifique, et l'application choisie s'ouvre automatiquement.

Figure 1 : Boîte de dialogue de sélection d'application

Le comportement de la boîte de dialogue de désambiguïsation a évolué au fil des versions d'Android. Par exemple, sur Android 12 et versions ultérieures, les liens Web qui ne sont pas des liens vers une application validés s'ouvrent généralement dans un navigateur Web par défaut. Sur les versions précédentes, une boîte de dialogue de clarification pouvait s'afficher si une application pouvait gérer le lien Web.

Remarque : À partir d'Android 12 (niveau d'API 31), un intent Web générique n'est résolu en activité dans votre application que si celle-ci est approuvée pour le domaine spécifique contenu dans cet intent Web. Si votre application n'est pas approuvée pour le domaine, l'intention Web est résolue dans l'application de navigateur par défaut de l'utilisateur.

Types de liens profonds

Vous pouvez prendre en charge trois types de liens profonds sur Android :

  • Liens profonds personnalisés : il s'agit de liens profonds qui utilisent un schéma URI personnalisé (tel que example://products/123) pour rediriger un utilisateur directement vers un contenu spécifique dans une application. Ils sont utiles pour la navigation interne ou les liens provenant de sources que vous contrôlez, mais ils ne sont pas des liens Web standards et peuvent toujours déclencher la boîte de dialogue de désambiguïsation si une autre application enregistre le même schéma personnalisé.
  • Liens Web : il s'agit de liens profonds qui utilisent les schémas standards http et https. Elles sont plus polyvalentes, car il s'agit d'URL standards. Toutefois, sur Android 12 et versions ultérieures, elles déclenchent presque toujours la boîte de dialogue de désambiguïsation. Cela signifie qu'elles sont susceptibles d'être traitées par le navigateur Web de l'utilisateur par défaut, plutôt que d'être redirigées vers votre application.
  • Liens d'application : disponibles depuis Android 6.0 (niveau d'API 23), il s'agit de liens Web validés. Grâce à un processus d'association de site Web, vous pouvez prouver au système Android que vous êtes propriétaire du domaine. Une fois la validation effectuée, le système redirige automatiquement les liens pour ce domaine directement vers votre application, en ignorant complètement la boîte de dialogue de clarification. Cela permet de créer une expérience fiable et fluide pour vos utilisateurs.

Ajouter des filtres d'intent pour les liens entrants

Pour créer un lien vers le contenu de votre application, ajoutez un filtre d'intent contenant ces éléments et valeurs d'attributs dans votre fichier manifeste :

<action>

Spécifiez l'action d'intent ACTION_VIEW afin que le filtre d'intent soit accessible depuis la recherche Google.

<data>

Ajoutez une ou plusieurs balises <data>, chacune représentant un format d'URI qui renvoie à l'activité. Au minimum, la balise <data> doit inclure l'attribut android:scheme.

Vous pouvez ajouter d'autres attributs pour affiner le type d'URI que l'activité accepte. Par exemple, vous pouvez avoir plusieurs activités qui acceptent des URI similaires, mais qui diffèrent simplement en fonction du nom du chemin d'accès. Dans ce cas, utilisez l'attribut android:path ou ses variantes pathPattern ou pathPrefix pour différencier l'activité que le système doit ouvrir pour différents chemins d'URI.

<category>

Incluez la catégorie BROWSABLE. Il est nécessaire pour que le filtre d'intent soit accessible depuis un navigateur Web. Sans cela, le fait de cliquer sur un lien dans un navigateur ne peut pas rediriger vers votre application.

Incluez également la catégorie DEFAULT. Cela permet à votre application de répondre aux intents implicites. Sans cela, l'activité ne peut être démarrée que si l'intent spécifie le nom du composant de votre application.

L'extrait XML suivant montre comment spécifier un filtre d'intent dans votre fichier manifeste pour le lien profond. Les URI "example://gizmos" et "http://www.example.com/gizmos" renvoient tous les deux à cette activité.

<activity
    android:name="com.example.android.GizmosActivity"
    android:label="@string/title_gizmos" >
    <intent-filter android:label="@string/filter_view_http_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
        <data android:scheme="http"
              android:host="www.example.com"
              android:pathPrefix="/gizmos" />
        <!-- note that the leading "/" is required for pathPrefix-->
    </intent-filter>
    <intent-filter android:label="@string/filter_view_example_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- Accepts URIs that begin with "example://gizmos” -->
        <data android:scheme="example"
              android:host="gizmos" />
    </intent-filter>
</activity>

Notez que les deux filtres d'intent ne diffèrent que par l'élément <data>. Bien qu'il soit possible d'inclure plusieurs éléments <data> dans le même filtre, il est important de créer des filtres distincts lorsque vous souhaitez déclarer des URL uniques (telles qu'une combinaison spécifique de scheme et host). En effet, plusieurs éléments <data> dans le même filtre d'intent sont en fait fusionnés pour tenir compte de toutes les variantes de leurs attributs combinés. Par exemple :

<intent-filter>
  ...
  <data android:scheme="https" android:host="www.example.com" />
  <data android:scheme="app" android:host="open.my.app" />
</intent-filter>

Il peut sembler que cette fonctionnalité ne soit compatible qu'avec https://www.example.com et app://open.my.app. Cependant, il prend en charge ces deux formats, ainsi que les suivants : app://www.example.com et https://open.my.app.

Attention : Si plusieurs activités contiennent des filtres d'intent qui renvoient au même lien d'application Android validé, il n'est pas garanti que l'une ou l'autre activité gère le lien.

Une fois que vous avez ajouté des filtres d'intent avec des URI pour le contenu d'activité au fichier manifeste de votre application, Android est en mesure de router tout Intent ayant des URI correspondants vers votre application au moment de l'exécution.

Pour en savoir plus sur la définition des filtres d'intent, consultez Autoriser d'autres applications à démarrer votre activité.

Lire les données des intents entrants

Une fois que le système a démarré votre activité via un filtre d'intent, vous pouvez utiliser les données fournies par Intent pour déterminer ce que vous devez afficher. Appelez les méthodes getData() et getAction() pour récupérer les données et l'action associées à l'Intent entrant. Vous pouvez appeler ces méthodes à tout moment au cours du cycle de vie de l'activité, mais il vaut généralement mieux le faire lors des premiers rappels, comme onCreate() ou onStart.

Voici un extrait qui montre comment récupérer des données à partir d'un Intent :

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val action: String? = intent?.action
    val data: Uri? = intent?.data
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();
}

Suivez ces bonnes pratiques pour améliorer l'expérience utilisateur :

  • Le lien profond doit rediriger directement les utilisateurs vers le contenu, sans aucune invite, page interstitielle ni connexion. Assurez-vous que les utilisateurs peuvent voir le contenu de l'application même s'ils ne l'ont jamais ouverte auparavant. Vous pouvez inviter les utilisateurs lors des interactions suivantes ou lorsqu'ils ouvrent l'application depuis le lanceur d'applications.
  • Suivez les consignes de conception décrites dans Navigation avec Retour et Haut afin que votre application corresponde aux attentes des utilisateurs concernant la navigation vers l'arrière après qu'ils y sont entrés via un lien profond.

Tester vos liens profonds

Vous pouvez utiliser Android Debug Bridge avec l'outil Activity Manager (am) pour vérifier que les URI de filtre d'intent que vous avez spécifiés pour les liens profonds sont résolus dans l'activité d'application appropriée. Vous pouvez exécuter la commande adb sur un appareil ou un émulateur.

La syntaxe générale pour tester un URI de filtre d'intent avec adb est la suivante :

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d <URI> <PACKAGE>

Par exemple, la commande suivante tente d'afficher une activité d'application cible associée à l'URI spécifié.

$ adb shell am start
        -W -a android.intent.action.VIEW
        -d "example://gizmos" com.example.android

Remarque : Lorsque vous définissez une collection de types primitifs dans un itinéraire, comme **@Serializable data class Product(val colors: List)**, le format d'URL de lien profond généré automatiquement est **basePath?colors={value**}. Si vous tentez de spécifier un URI avec plusieurs paramètres de requête (par exemple, **basepath?colors=red&colors=blue**), vous devez échapper l'esperluette (par exemple, **basepath?colors=red\&colors=blue**).

La déclaration dans le fichier manifeste et le gestionnaire d'intent que vous définissez déterminent la connexion entre votre application et un site Web, ainsi que ce qu'il faut faire avec les liens entrants. Toutefois, pour que le système traite votre application comme gestionnaire par défaut pour un ensemble d'URI, vous devez également demander au système de vérifier cette association. L'article Valider les liens vers une application explique comment implémenter cette validation.

Pour en savoir plus sur les intents et les liens d'application, consultez les ressources suivantes :