ÿÿ Adapty Android SDK v3.3 ã¸ã®ç§»è¡Œ | Adapty ドキュメント

Adapty Android SDK ã‚’ v3.3 ã«ç§»è¡Œã™ã‚‹

Adapty SDK 3.3.0 ã¯ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒªãƒªãƒ¼ã‚¹ã§ã‚りã€ã„ãã¤ã‹ã®æ”¹å–„ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ãŒã€ç§»è¡Œæ‰‹é †ãŒå¿…è¦ã«ãªã‚‹å ´åˆãŒã‚りã¾ã™ã€‚

  1. ペイウォールビルダーã§ä½œæˆã•れã¦ã„ãªã„ペイウォールã§ã®è³¼å…¥å‡¦ç†ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。USER_CANCELED ãŠã‚ˆã³ PENDING_PURCHASE エラーコードã®å‡¦ç†ã‚’åœæ­¢ã—ã¦ãã ã•ã„。キャンセルã•れãŸè³¼å…¥ã¯ã‚¨ãƒ©ãƒ¼ã¨ã—ã¦æ‰±ã‚れãªããªã‚Šã€ã‚¨ãƒ©ãƒ¼ãªã—ã®è³¼å…¥çµæžœã¨ã—ã¦è¿”ã•れã¾ã™ã€‚
  2. ペイウォールビルダーã§ä½œæˆã•れãŸãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã® onPurchaseCanceled ãŠã‚ˆã³ onPurchaseSuccess ã‚¤ãƒ™ãƒ³ãƒˆã‚’ã€æ–°ã—ã„ onPurchaseFinished イベントã«ç½®ãæ›ãˆã¦ãã ã•ã„。ã“ã®å¤‰æ›´ã‚‚åŒã˜ç†ç”±ã§ã™ï¼šã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れãŸè³¼å…¥ã¯ã‚¨ãƒ©ãƒ¼ã¨ã—ã¦æ‰±ã‚れãªããªã‚Šã€ã‚¨ãƒ©ãƒ¼ãªã—ã®è³¼å…¥çµæžœã«å«ã¾ã‚Œã¾ã™ã€‚
  3. ペイウォールビルダーã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã«å¯¾ã™ã‚‹ onAwaitingSubscriptionUpdateParams ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚·ã‚°ãƒãƒãƒ£ã‚’変更ã—ã¦ãã ã•ã„。
  4. ファイル URI を直接渡ã—ã¦ãƒ•ォールãƒãƒƒã‚¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’æä¾›ã—ã¦ã„ã‚‹å ´åˆã¯ã€ãã®æ–¹æ³•ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。
  5. Adjustã€AirBridgeã€Amplitudeã€AppMetricaã€Appsflyerã€Branchã€Facebook Adsã€Firebase and Google Analyticsã€Mixpanelã€OneSignalã€Pushwoosh ã®ã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³è¨­å®šã‚’æ›´æ–°ã—ã¦ãã ã•ã„。

購入処ç†ã®æ›´æ–°

以å‰ã¯ã€ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れãŸè³¼å…¥ã¨ä¿ç•™ä¸­ã®è³¼å…¥ã¯ã‚¨ãƒ©ãƒ¼ã¨ã—ã¦æ‰±ã‚れã€ãれãžã‚Œ USER_CANCELED ãŠã‚ˆã³ PENDING_PURCHASE コードãŒè¿”ã•れã¦ã„ã¾ã—ãŸã€‚

æ–°ã—ã„ AdaptyPurchaseResult クラスを使用ã—ã¦ã€ã‚­ãƒ£ãƒ³ã‚»ãƒ«ãƒ»æˆåŠŸãƒ»ä¿ç•™ä¸­ã®è³¼å…¥ã‚’示ã™ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚以下ã®ã‚ˆã†ã«è³¼å…¥ã‚³ãƒ¼ãƒ‰ã‚’æ›´æ–°ã—ã¦ãã ã•ã„:

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
         }
     }
 }

完全ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã§è³¼å…¥ã™ã‚‹ ページをã”覧ãã ã•ã„。

ペイウォールビルダーã®è³¼å…¥ã‚¤ãƒ™ãƒ³ãƒˆã‚’変更ã™ã‚‹

  1. 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)
    +        }
    +    }
    + }

    完全ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€æˆåŠŸãƒ»ã‚­ãƒ£ãƒ³ã‚»ãƒ«ãƒ»ä¿ç•™ä¸­ã®è³¼å…¥ ã¨ã‚¤ãƒ™ãƒ³ãƒˆã®èª¬æ˜Žã‚’ã”覧ãã ã•ã„。

  2. onPurchaseCancelled イベントã®å‡¦ç†ã‚’削除ã—ã¾ã™ï¼š

    - public override fun onPurchaseCanceled(
    -     product: AdaptyPaywallProduct,
    -     context: Context,
    - ) {}
  3. onPurchaseSuccess を削除ã—ã¾ã™ï¼š

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

onAwaitingSubscriptionUpdateParams メソッドã®ã‚·ã‚°ãƒãƒãƒ£ã‚’変更ã™ã‚‹

別ã®ã‚µãƒ–スクリプションãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªçŠ¶æ…‹ã§æ–°ã—ã„サブスクリプションãŒè³¼å…¥ã•れãŸå ´åˆã€æ–°ã—ã„ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—ã‚·ãƒ§ãƒ³ã§æ—¢å­˜ã®ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—ã‚·ãƒ§ãƒ³ã‚’ç½®ãæ›ãˆã‚‹ã«ã¯ onSubscriptionUpdateParamsReceived(AdaptySubscriptionUpdateParameters...)) ã‚’ã€æ—¢å­˜ã®ã‚µãƒ–スクリプションをアクティブã«ç¶­æŒã—ãªãŒã‚‰æ–°ã—ã„サブスクリプションを別途追加ã™ã‚‹ã«ã¯ onSubscriptionUpdateParamsReceived(null) を呼ã³å‡ºã—ã¦ãã ã•ã„:

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

最終的ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€ã‚µãƒ–スクリプションã®ã‚¢ãƒƒãƒ—グレード ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’ã”覧ãã ã•ã„。

フォールãƒãƒƒã‚¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®æä¾›æ–¹æ³•ã‚’æ›´æ–°ã™ã‚‹

フォールãƒãƒƒã‚¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’æä¾›ã™ã‚‹ãŸã‚ã«ãƒ•ァイル URI を渡ã—ã¦ã„ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«æ›´æ–°ã—ã¦ãã ã•ã„:

サードパーティインテグレーション㮠SDK 設定を更新ã™ã‚‹

Adapty Android SDK 3.3.0 以é™ã§ã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒæ­£ã—ã動作ã™ã‚‹ã‚ˆã†ã«ã€ä»¥ä¸‹ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«å¾“ã£ã¦å„インテグレーション㮠SDK 設定を更新ã—ã¦ãã ã•ã„。

Adjust

以下ã®ã‚ˆã†ã«ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。完全ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€Adjust インテグレーション㮠SDK 設定 ã‚’ã”覧ãã ã•ã„。

AirBridge

以下ã®ã‚ˆã†ã«ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。完全ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€AirBridge インテグレーション㮠SDK 設定 ã‚’ã”覧ãã ã•ã„。

 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

以下ã®ã‚ˆã†ã«ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。完全ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€Amplitude インテグレーション㮠SDK 設定 ã‚’ã”覧ãã ã•ã„。

 // 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

以下ã®ã‚ˆã†ã«ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。完全ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€AppMetrica インテグレーション㮠SDK 設定 ã‚’ã”覧ãã ã•ã„。

 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

以下ã®ã‚ˆã†ã«ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。完全ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€AppsFlyer インテグレーション㮠SDK 設定 ã‚’ã”覧ãã ã•ã„。

 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

以下ã®ã‚ˆã†ã«ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。完全ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€Branch インテグレーション㮠SDK 設定 ã‚’ã”覧ãã ã•ã„。

// 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

以下ã®ã‚ˆã†ã«ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。完全ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€Facebook Ads インテグレーション㮠SDK 設定 ã‚’ã”覧ãã ã•ã„。

- 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 and Google Analytics

以下ã®ã‚ˆã†ã«ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。完全ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€Firebase and Google Analytics インテグレーション㮠SDK 設定 ã‚’ã”覧ãã ã•ã„。

Mixpanel

以下ã®ã‚ˆã†ã«ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。完全ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€Mixpanel インテグレーション㮠SDK 設定 ã‚’ã”覧ãã ã•ã„。

- 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

以下ã®ã‚ˆã†ã«ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。完全ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€OneSignal インテグレーション㮠SDK 設定 ã‚’ã”覧ãã ã•ã„。

Pushwoosh

以下ã®ã‚ˆã†ã«ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。完全ãªã‚³ãƒ¼ãƒ‰ä¾‹ã«ã¤ã„ã¦ã¯ã€Pushwoosh インテグレーション㮠SDK 設定 ã‚’ã”覧ãã ã•ã„。

ÿÿÿÿ