Migrer le SDK Adapty Android vers v3.3

Le SDK Adapty 3.3.0 est une version majeure qui apporte des améliorations pouvant nécessiter quelques étapes de migration de votre part.

  1. Mettez à jour la façon dont vous gérez les achats dans les paywalls non créés avec le Paywall Builder. Arrêtez de traiter les codes d’erreur USER_CANCELED et PENDING_PURCHASE. Un achat annulé n’est plus considéré comme une erreur et apparaîtra désormais dans les résultats d’achat sans erreur.
  2. Remplacez les événements onPurchaseCanceled et onPurchaseSuccess par le nouvel événement onPurchaseFinished pour les paywalls créés avec le Paywall Builder. Ce changement est dû à la même raison : les achats annulés ne sont plus traités comme des erreurs et seront inclus dans les résultats d’achat sans erreur.
  3. Modifiez la signature de la méthode onAwaitingSubscriptionUpdateParams pour les paywalls Paywall Builder.
  4. Mettez à jour la méthode utilisée pour fournir les paywalls de secours si vous passez l’URI du fichier directement.
  5. Mettez à jour les configurations d’intégration pour Adjust, AirBridge, Amplitude, AppMetrica, Appsflyer, Branch, Facebook Ads, Firebase et Google Analytics, Mixpanel, OneSignal, Pushwoosh.

Mettre à jour les achats

Auparavant, les achats annulés et en attente étaient considérés comme des erreurs et retournaient respectivement les codes USER_CANCELED et PENDING_PURCHASE.

Désormais, une nouvelle classe AdaptyPurchaseResult est utilisée pour indiquer les achats annulés, réussis et en attente. Mettez à jour le code d’achat de la façon suivante :

Adapty.makePurchase(activity, product) { result ->
     when (result) {
         is AdaptyResult.Success -> {
-            val info = result.value
-            val profile = info?.profile
-        
-            if (profile?.accessLevels?.get("YOUR_ACCESS_LEVEL")?.isActive == true) {
-                // Grant access to the paid features
-            }
+            when (val purchaseResult = result.value) {
+                is AdaptyPurchaseResult.Success -> {
+                    val profile = purchaseResult.profile
+                    if (profile.accessLevels["YOUR_ACCESS_LEVEL"]?.isActive == true) {
+                        // Grant access to the paid features
+                    }
+                }
+
+                is AdaptyPurchaseResult.UserCanceled -> {
+                    // Handle the case where the user canceled the purchase
+                }
+
+                is AdaptyPurchaseResult.Pending -> {
+                    // Handle deferred purchases (e.g., the user will pay offline with cash
+                }
+            }
         }
         is AdaptyResult.Error -> {
             val error = result.error
             // Handle the error
         }
     }
 }

Pour un exemple de code complet, consultez la page Effectuer des achats dans l’application mobile.

Modifier les événements d’achat du Paywall Builder

  1. Ajoutez l’événement onPurchaseFinished :

    + public override fun onPurchaseFinished(
    +     purchaseResult: AdaptyPurchaseResult,
    +     product: AdaptyPaywallProduct,
    +     context: Context,
    + ) {
    +    when (purchaseResult) {
    +        is AdaptyPurchaseResult.Success -> {
    +            // Grant access to the paid features
    +        }
    +        is AdaptyPurchaseResult.UserCanceled -> {
    +            // Handle the case where the user canceled the purchase
    +        }
    +        is AdaptyPurchaseResult.Pending -> {
    +            // Handle deferred purchases (e.g., the user will pay offline with cash)
    +        }
    +    }
    + }

    Pour un exemple de code complet, consultez Achat réussi, annulé ou en attente et la description de l’événement.

  2. Supprimez le traitement de l’événement onPurchaseCancelled :

    - public override fun onPurchaseCanceled(
    -     product: AdaptyPaywallProduct,
    -     context: Context,
    - ) {}
  3. Supprimez onPurchaseSuccess :

    
    - public override fun onPurchaseSuccess(
    -     profile: AdaptyProfile?,
    -     product: AdaptyPaywallProduct,
    -   context: Context,
    - ) {
    -     // Your logic on successful purchase
    - }

Modifier la signature de la méthode onAwaitingSubscriptionUpdateParams

Désormais, si un nouvel abonnement est souscrit alors qu’un autre est encore actif, appelez onSubscriptionUpdateParamsReceived(AdaptySubscriptionUpdateParameters...)) si le nouvel abonnement doit remplacer l’abonnement actif, ou onSubscriptionUpdateParamsReceived(null) si l’abonnement actif doit rester actif et le nouveau être ajouté séparément :

- public override fun onAwaitingSubscriptionUpdateParams(
-     product: AdaptyPaywallProduct,
-     context: Context,
- ): AdaptySubscriptionUpdateParameters? {
-     return AdaptySubscriptionUpdateParameters(...)
- }
+ public override fun onAwaitingSubscriptionUpdateParams(
+     product: AdaptyPaywallProduct,
+     context: Context,
+     onSubscriptionUpdateParamsReceived: SubscriptionUpdateParamsCallback,
+ ) {
+     onSubscriptionUpdateParamsReceived(AdaptySubscriptionUpdateParameters(...))
+ }

Consultez la section Mettre à niveau un abonnement pour l’exemple de code final.

Mettre à jour la fourniture des paywalls de secours

Si vous passez l’URI d’un fichier pour fournir des paywalls de secours, mettez à jour votre code de la façon suivante :

Mettre à jour la configuration du SDK des intégrations tierces

Pour garantir le bon fonctionnement des intégrations avec le SDK Adapty Android 3.3.0 et versions ultérieures, mettez à jour vos configurations SDK pour les intégrations suivantes comme décrit dans les sections ci-dessous.

Adjust

Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour un exemple de code complet, consultez la Configuration du SDK pour l’intégration Adjust.

AirBridge

Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour un exemple de code complet, consultez la Configuration du SDK pour l’intégration AirBridge.

 Airbridge.getDeviceInfo().getUUID(object: AirbridgeCallback.SimpleCallback<String>() {
     override fun onSuccess(result: String) {
-         val params = AdaptyProfileParameters.Builder()
-             .withAirbridgeDeviceId(result)
-             .build()
-         Adapty.updateProfile(params) { error ->
-             if (error != null) {
-                 // Handle the error
-             }
-         }
+         Adapty.setIntegrationIdentifier("airbridge_device_id", result) { error ->
+             if (error != null) {
+                 // Handle the error
+             }
+         }
     }
     override fun onFailure(throwable: Throwable) {
     }
 })

Amplitude

Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour un exemple de code complet, consultez la Configuration du SDK pour l’intégration Amplitude.

 // For Amplitude maintenance SDK (obsolete)
 val amplitude = Amplitude.getInstance()
 val amplitudeDeviceId = amplitude.getDeviceId()
 val amplitudeUserId = amplitude.getUserId()

 //for actual Amplitude Kotlin SDK
 val amplitude = Amplitude(
     Configuration(
         apiKey = AMPLITUDE_API_KEY,
         context = applicationContext
     )
 )
 val amplitudeDeviceId = amplitude.store.deviceId
 val amplitudeUserId = amplitude.store.userId

 //

- val params = AdaptyProfileParameters.Builder()
-     .withAmplitudeDeviceId(amplitudeDeviceId)
-     .withAmplitudeUserId(amplitudeUserId)
-     .build()
- Adapty.updateProfile(params) { error ->
-     if (error != null) {
-         // Handle the error
-     }
- }

+ Adapty.setIntegrationIdentifier("amplitude_user_id", amplitudeUserId) { error ->
+     if (error != null) {
+         // Handle the error
+     }
+ }

+ Adapty.setIntegrationIdentifier("amplitude_device_id", amplitudeDeviceId) { error ->
+     if (error != null) {
+         // Handle the error
+     }
+ }

AppMetrica

Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour un exemple de code complet, consultez la Configuration du SDK pour l’intégration AppMetrica.

 val startupParamsCallback = object: StartupParamsCallback {
     override fun onReceive(result: StartupParamsCallback.Result?) {
         val deviceId = result?.deviceId ?: return

-        val params = AdaptyProfileParameters.Builder()
-            .withAppmetricaDeviceId(deviceId)
-            .withAppmetricaProfileId("YOUR_ADAPTY_CUSTOMER_USER_ID")
-            .build()
-        Adapty.updateProfile(params) { error ->
-            if (error != null) {
-                // Handle the error
-            }
-        }

+        Adapty.setIntegrationIdentifier("appmetrica_device_id", deviceId) { error ->
+            if (error != null) {
+                // Handle the error
+            }
+        }
+        
+        Adapty.setIntegrationIdentifier("appmetrica_profile_id", "YOUR_ADAPTY_CUSTOMER_USER_ID") { error ->
+            if (error != null) {
+                // Handle the error
+            }
+        }
     }

     override fun onRequestError(
         reason: StartupParamsCallback.Reason,
         result: StartupParamsCallback.Result?
     ) {
         // Handle the error
     }
 }

 AppMetrica.requestStartupParams(context, startupParamsCallback, listOf(StartupParamsCallback.APPMETRICA_DEVICE_ID))

AppsFlyer

Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour un exemple de code complet, consultez la Configuration du SDK pour l’intégration AppsFlyer.

 val conversionListener: AppsFlyerConversionListener = object : AppsFlyerConversionListener {
     override fun onConversionDataSuccess(conversionData: Map<String, Any>) {
-        Adapty.updateAttribution(
-            conversionData,
-            AdaptyAttributionSource.APPSFLYER,
-            AppsFlyerLib.getInstance().getAppsFlyerUID(context)
-        ) { error ->
-            if (error != null) {
-                // Handle the error
-            }
-        }

+        val uid = AppsFlyerLib.getInstance().getAppsFlyerUID(context)
+        Adapty.setIntegrationIdentifier("appsflyer_id", uid) { error ->
+            if (error != null) {
+                // Handle the error
+            }
+        }
+        Adapty.updateAttribution(conversionData, "appsflyer") { error ->
+            if (error != null) {
+                // Handle the error
+            }
+        }
     }
 }

Branch

Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour un exemple de code complet, consultez la Configuration du SDK pour l’intégration Branch.

// Login and update attribution
 Branch.getAutoInstance(this)
   .setIdentity("YOUR_USER_ID") { referringParams, error ->
       referringParams?.let { data ->
-            Adapty.updateAttribution(data, AdaptyAttributionSource.BRANCH) { error ->
-                if (error != null) {
-                    // Handle the error
-                }
-            }
+            Adapty.updateAttribution(data, "branch") { error ->
+                if (error != null) {
+                    // Handle the error
+                }
+            }
       }
   }

 // Logout
 Branch.getAutoInstance(context).logout()

Facebook Ads

Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour un exemple de code complet, consultez la Configuration du SDK pour l’intégration Facebook Ads.

- val builder = AdaptyProfileParameters.Builder()
-     .withFacebookAnonymousId(AppEventsLogger.getAnonymousAppDeviceGUID(context))
-   
- Adapty.updateProfile(builder.build()) { error ->
-     if (error != null) {
-        // Handle the error
-     }
- }

+ Adapty.setIntegrationIdentifier(
+     "facebook_anonymous_id",
+     AppEventsLogger.getAnonymousAppDeviceGUID(context)
+ ) { error ->
+     if (error != null) {
+        // Handle the error
+     }
+ }

Firebase et Google Analytics

Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour un exemple de code complet, consultez la Configuration du SDK pour l’intégration Firebase et Google Analytics.

Mixpanel

Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour un exemple de code complet, consultez la Configuration du SDK pour l’intégration Mixpanel.

- val params = AdaptyProfileParameters.Builder()
-     .withMixpanelUserId(mixpanelAPI.distinctId)
-     .build()
-
- Adapty.updateProfile(params) { error ->
-     if (error != null) {
-         // Handle the error
-     }
- }

+ Adapty.setIntegrationIdentifier("mixpanel_user_id", mixpanelAPI.distinctId) { error ->
+     if (error != null) {
+         // Handle the error
+     }
+ }

OneSignal

Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour un exemple de code complet, consultez la Configuration du SDK pour l’intégration OneSignal.

Pushwoosh

Mettez à jour le code de votre application mobile comme indiqué ci-dessous. Pour un exemple de code complet, consultez la Configuration du SDK pour l’intégration Pushwoosh.