Il y a 3 semaines -

Temps de lecture 3 minutes

Android : Comment faire du deeplink facilement

Vous connaissez probablement le principe du deeplink qui est de pouvoir accéder directement à une page d’une application native via une application externe telle qu’un navigateur.

Mise en place classique

Sur Android, on va ajouter à notre AndroidManifest.xml ce qu’on appelle des intent-filter, qui vont permettre à notre application d’intercepter certaines URL selon un certain format.

Il est préférable d’utiliser le launchMode de l’activity en singleLaunch pour éviter la multiple instanciation des activities.

AndroidManifest.xml
   <activity android:name="cdreyfus.mydeeplink.HomeActivity" android:launchMode="singleTask">
            <intent-filter&amp;gt;
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:host="mydeeplink.fr" android:pathPrefix="/home" android:scheme="https" />
          
            </intent-filter>
	</activity>

Ceci va permettre à notre application d’intercepter l’URL https://mydeeplink.fr/home et d’accéder à HomeActivity (avec l’autorisation de notre utilisateur).

Nous pouvons vérifier grâce à la commande suivante que notre intent-filter remplit son objectif:

adb shell am start -a android.intent.action.VIEW -d "https://mydeeplink.fr/home"

Tellement plus simple avec Navigation Component

Le Navigation Componentest l’un des composants de base de Jetpack, permettant comme son nom l’indique de faciliter la mise en place de la navigation dans les applications Android. Je vous renvoie à l’article Android: Navigation Architecture Component pour plus de détails; pour l’instant, nous allons nous concentrer sur la nouvelle gestion du deeplink. Vous avez simplement besoin de savoir que l’ensemble de l’UI de l’application est représentée dans un graphe. Pour chaque élément du graphe (Fragment/Activity), on peut ajouter un ou plusieurs liens deeplink avec un système de pattern qui peut s’avérer très utile.

Contrairement à nos intent-filters, on va simplement indiquer la localisation du graphe dans le manifest :

AndroidManifest.xml
 <activity android:name=".MainActivity" android:launchMode="singleTask">
		<nav-graph android:value="@navigation/nav_graph"/>
</activity>

 

Ici, j’ai voulu utiliser le deeplink pour accéder directement à mon OtherFragment via une URL du type https://mydeeplink.fr/{userId}. Pour accéder à mon paramètre userId je n’ai plus qu’à récupérer l’argument dans l’intent, et ceci directement depuis mon OtherFragment:

OtherFragment.kt
class OtherFragment : Fragment() {

	private val userId by lazy { arguments?.getString("userId") }
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_other, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        hello_user.text = "Hello $userId !" 
    }
}

 

Résultat:

adb shell am start -a android.intent.action.VIEW -d "https://mydeeplink.fr/cecile"

Néanmoins, en cas d’erreur…

Il est fortement conseillé d’anticiper les cas d’erreur, plusieurs liens issus d’un site Web peuvent correspondre aux patterns que vous avez utilisés. Je recommande une gestion d’erreur à effectuer dans l’application, soit pour effectuer une redirection interne, soit pour rediriger l’utilisateur vers un navigateur.

Le petit plus pour la fin

Si vous utilisez Navigation Component avec une navigation bar (AppBottomBar ou BottomNavigationView), je vous encourage à utiliser les méthodes de deeplink associées. Vous pourrez ainsi proposer à vos utilisateurs une meilleure expérience de navigation.

OtherFragment.kt
    private val navController by lazy { findNavController(R.id.nav_host_fragment) }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        navController.handleDeepLink(intent)
    }

Publié par Simone Civetta

Simone est responsable technique des équipes mobilités chez Xebia. Il est également formateur au sein de Xebia Training .

Publié par Benjamin Lacroix

Benjamin Lacroix est lead développeur et manager chez Xebia. Il est également formateur au sein de Xebia Training .

Commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous recrutons

Être un Xebian, c'est faire partie d'un groupe de passionnés ; C'est l'opportunité de travailler et de partager avec des pairs parmi les plus talentueux.