# SDK Kotlin Multiplatform

URL: https://traqio.app/fr/docs/sdks/kotlin-multiplatform
Last updated: 2026-10-14

Ajoutez Traqio à une app Kotlin Multiplatform : une dépendance commonMain, le contexte Android, l’init depuis le code partagé, puis cycle de vie et URL.

`io.khufu.traqio:traqio-kmp` est le SDK Traqio pour Kotlin Multiplatform : le client — file d’attente, envoi par lots, nouvelles tentatives, deep links, consentement — vit dans `commonMain`, et chaque cible fournit ses briques de plateforme : l’**Install Referrer de Google Play** sur Android, l’enregistrement **SKAdNetwork** sur iOS. Kotlin Multiplatform n’a pas de cycle de vie d’app partagé : c’est donc l’app hôte qui signale les retours au premier plan et transmet les URL qui l’ouvrent.

## Prérequis

- Kotlin 1.9 ou ultérieur, avec kotlinx-coroutines (apporté par le SDK).
- Cibles : Android (API 21+), iosArm64 et iosSimulatorArm64.

## Mise en place

### Ajoutez la dépendance à commonMain

```kotlin
// shared/build.gradle.kts
kotlin {
    sourceSets {
        commonMain.dependencies {
            implementation("io.khufu.traqio:traqio-kmp:0.1.0")
        }
    }
}
```

Tant que l’artefact n’est pas sur Maven Central, publiez le build que nous vous envoyons dans votre dépôt Maven local (`mavenLocal()`) et gardez les mêmes coordonnées.

### Attachez le contexte Android, puis initialisez

Android — Application:
```kotlin
import io.khufu.traqio.kmp.Traqio
import io.khufu.traqio.kmp.TraqioAndroid

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        TraqioAndroid.attach(this)   // FIRST: the SDK keeps its state in this app's SharedPreferences
        Traqio.init(sdkKey = "YOUR_SDK_KEY", endpoint = "https://api.traqio.app")
    }
}
```

iOS — init de l’App / didFinishLaunching:
```swift
// Swift, through your shared framework. Kotlin's `init` is `doInit` in Swift,
// and Kotlin default arguments are not visible there: pass every parameter.
Traqio.shared.doInit(
    sdkKey: "YOUR_SDK_KEY",
    endpoint: "https://api.traqio.app",
    userId: nil,
    deepLinking: true,
    consent: nil
)
```

### Signalez les ouvertures de l’app

```kotlin
// Android — e.g. a ProcessLifecycleOwner observer
override fun onStart(owner: LifecycleOwner) = Traqio.appOpened()

// iOS — sceneDidBecomeActive / applicationDidBecomeActive
Traqio.shared.appOpened()
```

Dédoublonné par un délai de session de 30 minutes : vous pouvez donc l’appeler sans risque à chaque reprise. Sans lui, vos utilisateurs semblent ne jamais revenir, et la rétention affiche zéro après le jour 0.

### Transmettez les URL qui ouvrent l’app

```kotlin
// In the activity that handles links — onCreate AND onNewIntent
TraqioAndroid.handleIntent(intent)

Traqio.onDeepLink { link -> link.deepLink?.let(router::navigate) }
```

```swift
// app/scene delegate, or SwiftUI .onOpenURL
Traqio.shared.handleUrlAsync(url: url.absoluteString, callback: nil)
```

## Événements

```kotlin
Traqio.setUserId(user.id)              // same id as RevenueCat's app_user_id
Traqio.track("purchase", value = 9.99, currency = "EUR")
```

Les événements sont envoyés dès qu’ils sont mis en file d’attente, par lots de 20, retentés avec un backoff exponentiel jusqu’à cinq minutes. Noms : [Noms d’événements](https://traqio.app/fr/docs/concepts/events-and-revenue#names).

## Pas encore dans ce SDK

### iOS

Les installations sont enregistrées auprès de SKAdNetwork, mais aucune valeur de conversion n’est définie et aucun jeton Apple Ads n’est transmis.

### Les deux plateformes

Pas de nouvelle tentative de l’Install Referrer, pas d’identifiant de transaction sur les achats, pas de revenus publicitaires AdMob, pas d’effacement depuis l’app — utilisez [RevenueCat](https://traqio.app/fr/docs/integrations/revenuecat) et l’[effacement côté serveur](https://traqio.app/fr/docs/concepts/privacy#erasure).

> **Preuves à ce jour** Le code commun et le code Android compilent en CI et la logique commune est couverte par des tests unitaires ; le framework iOS nécessite un build macOS qui ne tourne qu’à la publication du paquet.

## Questions fréquentes

**Pourquoi faut-il appeler TraqioAndroid.attach avant init ?**
Sur Android, le SDK stocke son état — le marqueur d’installation, la file d’attente, l’identifiant de l’appareil — dans les SharedPreferences de l’app, ce qui nécessite un Context Android dont le code Kotlin partagé ne dispose pas. attach lui fournit le contexte de l’application. Appeler init d’abord échoue au premier accès au stockage.

**Comment appeler le SDK depuis Swift ?**
Via votre framework partagé, sous le nom Traqio.shared. Kotlin/Native renomme en doInit, côté Swift, une fonction appelée init, et les arguments par défaut de Kotlin ne sont pas visibles depuis Swift : chaque paramètre de doInit est donc passé explicitement.
