Ordre d'appel dans le SDK Flutter
Adapty().activate() doit se terminer avant tout autre appel à une méthode du SDK Adapty. Tant qu’il n’est pas résolu, le SDK n’a aucun état. Tout appel émis avant ou en parallèle d’activate() échoue avec #2002 notActivated.
Si votre application authentifie les utilisateurs et que vous collectez un identifiant utilisateur après le lancement, appelez Adapty().identify() à ce moment-là. N’appelez pas de méthodes d’action utilisateur avant que identify ne soit résolu. Les appels en concurrence échouent soit avec #3006 profileWasChanged, soit s’appliquent au profil anonyme créé lors de l’activation. Dans ce cas, l’attribution, les identifiants MMP tels que appsflyer_id et la propriété de l’installation ne sont pas toujours transférés vers le profil identifié. Si votre application n’authentifie pas les utilisateurs, ignorez identify et continuez à travailler avec le profil anonyme.
Les SDK MMP et d’analyse (AppsFlyer, Adjust, Branch, PostHog) suivent la même règle. Initialisez-les en premier et attendez leurs callbacks d’UID avant d’appeler Adapty().activate. Sinon, l’identifiant MMP est associé à un profil anonyme de courte durée et n’est pas toujours transféré vers le profil identifié. Pour les particularités d’AppsFlyer, consultez AppsFlyer.
L’ordre correct
Votre parcours dépend de deux choses : le moment où vous connaissez l’identifiant utilisateur client, et si vous utilisez un MMP ou un SDK d’analyse.
- Étapes 2 et 5 : Obligatoires pour toutes les applications. Activez le SDK, puis appelez les méthodes du SDK.
- Étapes 1 et 3 : Requises uniquement si vous intégrez un MMP ou un SDK d’analyse (AppsFlyer, Adjust, Branch, PostHog).
- Étape 4 : Requise uniquement si votre application authentifie les utilisateurs et collecte l’identifiant utilisateur client après le lancement.
Si vous disposez de l’identifiant utilisateur client au lancement de l’application, passez-le directement dans activate() (étape 2a). Ce chemin ne crée jamais de profil anonyme, donc l’étape 4 est inutile.
| Étape | Appel | Quand | Notes |
|---|---|---|---|
| 1 | Initialiser votre SDK MMP ou analytics (AppsFlyer, Adjust, PostHog, Branch) | Au lancement de l’app, en premier | Attendez le callback UID du MMP, par exemple getAppsFlyerUID. |
| 2a | Adapty().activate(configuration: ...) avec withCustomerUserId défini dans la configuration | Au lancement de l’app, après l’étape 1, si vous avez l’identifiant utilisateur client | Recommandé. Aucun profil anonyme n’est jamais créé. |
| 2b | Adapty().activate(configuration: ...) sans withCustomerUserId | Au lancement de l’app, après l’étape 1, si vous n’avez pas l’identifiant utilisateur client (ou ne le collectez jamais) | Adapty crée un profil anonyme. |
| 3 | Adapty().setIntegrationIdentifier(key: ..., value: ...) pour chaque MMP | Après l’étape 2, avant tout appel lié à une action utilisateur | Nécessaire pour que les identifiants MMP soient associés au bon profil. |
| 4 | await Adapty().identify(customerUserId) | Après l’étape 3 (ou l’étape 2 si pas de MMP), avant l’étape 5 — uniquement sur le chemin 2b avec authentification | Toujours await. Des appels simultanés pendant identify génèrent #3006 profileWasChanged. |
| 5 | getPaywall (getFlow dans le SDK v4), getPaywallProducts, restorePurchases, makePurchase, updateAttribution (updateExternalAttribution dans le SDK 4.1), updateProfile | Après l’étape 4 si vous appelez identify ; sinon après l’étape 3 (ou l’étape 2 si pas de MMP) | Ces appels nécessitent un profil stable. |
Ignorer ces étapes entraîne une perte d’accès premium pour les utilisateurs récurrents, l’absence d’appsflyer_id sur les profils, et des paywalls affichés pour la mauvaise audience.
Installations web2app et web-funnel
Si des utilisateurs achètent via un checkout web (Stripe, Paddle) puis installent l’application native, le premier activate() sur l’appareil crée un nouveau profil anonyme. Ce profil n’est pas lié au profil web. Si vous pouvez résoudre l’identifiant utilisateur avant le lancement de l’application (depuis votre flow d’authentification ou le referrer d’installation), passez-le directement dans activate(). Sinon, l’achat web reste invisible sur l’appareil jusqu’à ce que vous appeliez identify("YOUR_USER_ID") puis restorePurchases.
Pour les métadonnées à envoyer avec chaque checkout web, consultez :