Kotlin
Suivre les écrans, les sessions et les événements d'une application Android écrite en Kotlin, avec le SDK io.sessio:sessio-android.
Sessio mesure les applications Android natives : écrans vus, visiteurs, sessions, temps passé par écran, rétention, pays, appareil, version de l'app et événements personnalisés. Les données arrivent dans le même dashboard que vos sites web et vos autres applications.
Cette page donne tous les exemples en Kotlin. Votre application est écrite en Java ? Voyez Java : c'est le même SDK, io.sessio:sessio-android, avec les mêmes fonctions. Pour une application React Native, voyez React Native.
#1. Créer l'application dans Sessio
- Dans le dashboard, ouvrez Sites puis Nouveau site ou app.
- Choisissez Application mobile, puis la plateforme Android.
- Une fois l'application créée, ouvrez sa fenêtre d'installation et choisissez Android (Kotlin et Java), puis Kotlin : elle affiche votre code de suivi et les extraits prêts à copier.
#2. Ajouter le SDK
Le SDK est servi par le serveur Sessio, dans un dépôt Maven. Ajoutez ce dépôt, puis la dépendance :
// settings.gradle.kts
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url = uri("https://api-sessio.flamme.work/sdk/maven") }
}
}
// app/build.gradle.kts
dependencies {
implementation("io.sessio:sessio-android:0.1.0")
}Votre projet utilise encore des fichiers Gradle en Groovy (.gradle) ? L'extrait Groovy est sur la page Java ; il convient aussi à une app Kotlin.
- Android 5 (API 21) et plus, Kotlin 1.8 et plus.
- Le SDK n'ajoute aucune autre dépendance que la bibliothèque standard de Kotlin. Rien n'est à ajouter dans les règles ProGuard / R8.
- La permission
INTERNETest déclarée par le SDK.
#3. Démarrer le SDK
Dans votre classe Application :
import android.app.Application
import io.sessio.android.Sessio
class MonApplication : Application() {
override fun onCreate() {
super.onCreate()
Sessio.init(this, "VOTRE_CODE_DE_SUIVI")
}
}Déclarez-la dans AndroidManifest.xml : <application android:name=".MonApplication" …>.
Les réglages se passent avec SessioOptions, par leur nom :
import io.sessio.android.SessioOptions
Sessio.init(this, "VOTRE_CODE_DE_SUIVI", SessioOptions(debug = true))| Option | Défaut | Rôle |
|---|---|---|
endpoint |
https://api-sessio.flamme.work |
l'adresse du serveur Sessio |
trackActivities |
true |
un écran par Activity affichée |
flushIntervalSeconds |
10 |
l'intervalle d'envoi |
maxBatch |
50 |
le nombre maximal d'événements par envoi (100 au plus) |
appVersion, appBuild |
ceux de l'app | pour remplacer la version et le build lus dans le PackageManager |
debug |
false |
écrit les opérations du SDK dans Logcat, étiquette Sessio |
#4. Suivre les écrans
#Une Activity par écran (automatique)
Rien à faire : chaque Activity affichée est un écran, nommé d'après sa classe sans le suffixe Activity (ProduitActivity devient Produit). Une rotation ou un retour dans l'app ne le recompte pas.
#Jetpack Compose et Navigation
Avec une seule Activity, ce sont les destinations qui comptent. Branchez le suivi sur le NavController :
val navController = rememberNavController()
LaunchedEffect(navController) { SessioNavigation.track(navController) }Avec les Fragments :
SessioNavigation.track(findNavController(R.id.nav_host))Chaque destination est enregistrée sous le modèle de sa route, produit/{id} et non produit/42 : un même écran n'est compté qu'une fois, quel que soit le produit affiché. Le suivi par Activity est alors coupé de lui-même, pour éviter les doublons.
#À la main
Sessio.screen("Panier")
Sessio.screen("Produit/Détail", mapOf("categorie" to "thé"))Le nom de l'écran sert d'identifiant : gardez toujours la même orthographe.
#5. Envoyer des événements
Sessio.track("achat", mapOf("montant" to 5000, "devise" to "XAF"))
Sessio.track("inscription")Les propriétés acceptent des textes, des nombres, des booléens, des listes et des Map imbriquées.
#6. Reconnaître un visiteur
Sessio.identify("[email protected]") // un libellé lisible pour ce visiteur
Sessio.identify("") // l'effacer
Sessio.reset() // nouvel identifiant visiteur (déconnexion, changement de compte)#Comment ça marche
- Visiteurs : un identifiant aléatoire est créé au premier lancement et conservé. C'est lui qui compte les visiteurs uniques, nouveaux et récurrents.
- Sessions : une session démarre à chaque lancement à froid, et une nouvelle quand l'application est restée plus de 30 minutes en arrière-plan. Au retour dans l'app, le même écran continue : il ne compte pas comme une nouvelle vue.
- Hors-ligne : les événements sont conservés sur le téléphone (1 000 au plus) et envoyés par lots dès que le réseau revient, avec un délai croissant entre les essais, de 2 secondes à 5 minutes. Chaque événement porte un identifiant unique : un lot renvoyé n'est jamais compté deux fois.
- Aucun blocage : toutes les méthodes rendent la main tout de suite ; le stockage et le réseau se font sur un fil à part.
- Pays et ville : déduits de l'adresse IP par le serveur, comme pour un site web.
#Ce qui est collecté
| Collecté | Détail |
|---|---|
| Vos données | les écrans vus et les événements que vous envoyez, avec leurs propriétés |
| Le contexte | l'heure, l'identifiant d'installation, la langue, le fuseau horaire |
| L'appareil | la version d'Android, le modèle et le fabricant, la taille et la densité de l'écran |
| L'application | la version et le build |
Ce qui n'est pas collecté : pas de replay ni d'enregistrement d'écran, pas de capture des appuis, pas de rapport de plantage, pas d'identifiant publicitaire, pas de contacts, pas de position précise.
#Vie privée
Le SDK n'utilise pas l'identifiant publicitaire. L'identifiant d'installation est propre à votre application ; Sessio.reset() en crée un nouveau. N'envoyez pas de données personnelles dans les noms d'écrans ni dans les propriétés des événements.
#Consentement
Sessio.optOut() // l'utilisateur refuse : plus rien n'est envoyé, même après un redémarrage
Sessio.optIn() // il accepte, ou revient sur son refus
Sessio.isOptedOut() // true s'il a refuséPour ne rien envoyer avant d'avoir demandé, appelez Sessio.optOut() au premier lancement, puis Sessio.optIn() quand la personne accepte.
#Dépannage
#Rien n'arrive dans le dashboard
- Passez
SessioOptions(debug = true)et lisez Logcat (adb logcat -s Sessio) : chaque envoi y est écrit. - Vérifiez le code de suivi : un code inconnu est refusé et les données sont abandonnées.
- En développement sur l'émulateur, le serveur de votre machine se joint en
http://10.0.2.2:<port>, et le HTTP en clair doit être autorisé (android:usesCleartextTraffic="true").
#Gradle ne trouve pas io.sessio:sessio-android
Le dépôt doit être déclaré là où votre projet déclare les siens : dans settings.gradle.kts (dependencyResolutionManagement) pour un projet récent, sinon dans le build.gradle.kts racine (allprojects { repositories { … } }).
#Un écran est compté deux fois
Une app Compose avec SessioNavigation.track et des Sessio.screen() à la main pour les mêmes écrans : gardez l'un ou l'autre.