Adapty React Native SDK を v3.3 に移行する

Adapty SDK 3.3.1 はメジャーリリースであり、いくつかの改善が加えられています。移行作業が必要な場合があります。

  1. Adapty SDK v3.3.x にアップグレードする。
  2. モデルを更新する。
  3. getProductsIntroductoryOfferEligibility メソッドを削除する。
  4. 購入処理を更新する。
  5. ペイウォールビルダーのペイウォール表示を更新する。
  6. 開発者定義タイマーの実装を修正する。
  7. ペイウォールビルダーの購入イベント処理を更新する。
  8. ペイウォールビルダーのカスタムアクションイベント処理を更新する。
  9. onProductSelected コールバックを修正する。
  10. updateProfile メソッドからサードパーティ連携パラメーターを削除する。
  11. Adjust、AirBridge、Amplitude、AppMetrica、Appsflyer、Branch、Facebook Ads、Firebase と Google Analytics、Mixpanel、OneSignal、Pushwoosh の連携設定を更新する。
  12. オブザーバーモードの実装を更新する。

Adapty React Native SDK を 3.3.x にアップグレードする

バージョン 3.3.1 より前は、react-native-adapty SDK がアプリで Adapty を正しく動作させるためのコアかつ必須の SDK でした。@adapty/react-native-ui SDK はオプションであり、Adapty ペイウォールビルダーを使用する場合にのみ必要でした。

バージョン 3.3.1 以降、@adapty/react-native-ui SDK は非推奨となり、その機能は react-native-adapty SDK に統合されました。バージョン 3.3.1 にアップグレードするには、以下の手順に従ってください。

  1. react-native-adapty パッケージをバージョン 3.3.1 に更新する。
  2. プロジェクトの依存関係から @adapty/react-native-ui パッケージを削除する。
  3. プロジェクトの依存関係を同期して変更を適用する。

モデルの変更点

新しいモデル

  1. AdaptySubscriptionOffer:

    export interface AdaptySubscriptionOffer {
      readonly identifier: AdaptySubscriptionOfferId;
    
      phases: AdaptyDiscountPhase[];
    
      android?: {
        offerTags?: string[];
      };
    }
  2. AdaptySubscriptionOfferId:

    export type AdaptySubscriptionOfferId =
      | { id?: string; type: 'introductory'; }
      | { id: string; type: 'promotional' | 'win_back'; };

変更されたモデル

  1. AdaptyPaywallProduct:

    • subscriptionDetails プロパティを subscription に名前変更しました。

    -  subscriptionDetails?: AdaptySubscriptionDetails; 
    +  subscription?: AdaptySubscriptionDetails;
  2. AdaptySubscriptionDetails:

    • promotionalOffer は削除されました。プロモーションオファーは、利用可能な場合にのみ offer プロパティ経由で提供されるようになりました。この場合、offer?.identifier?.type'promotional' になります。

    • introductoryOfferEligibility は削除されました(オファーはユーザーが対象の場合のみ返されます)。

    • offerId は削除されました。オファー ID は AdaptySubscriptionOffer.identifier に格納されるようになりました。

    • offerTagsAdaptySubscriptionOffer.android に移動されました。

    -  introductoryOffers?: AdaptyDiscountPhase[];
    +  offer?: AdaptySubscriptionOffer;
    
       ios?: {
    -    promotionalOffer?: AdaptyDiscountPhase;
         subscriptionGroupIdentifier?: string;
       };
    
       android?: {
    -    offerId?: string;
         basePlanId: string;
    -    introductoryOfferEligibility: OfferEligibility;
    -    offerTags?: string[];
         renewalType?: 'prepaid' | 'autorenewable';
       };
     }
  3. AdaptyDiscountPhase:

    • identifier フィールドが AdaptyDiscountPhase モデルから削除されました。オファー識別子は AdaptySubscriptionOffer.identifier に格納されるようになりました。

    -  ios?: {
    -    readonly identifier?: string;
    -  };

削除されたモデル

  1. AttributionSource:
    • AttributionSource が以前使用されていた箇所では、文字列が使用されるようになりました。
  2. OfferEligibility:
    • このモデルは不要になったため削除されました。オファーはユーザーが対象の場合にのみ返されるようになりました。

getProductsIntroductoryOfferEligibility メソッドを削除する

Adapty SDK 3.3.1 より前は、プロダクトオブジェクトにはユーザーが対象外であってもオファーが常に含まれていました。そのため、オファーを使用する前に手動で対象資格を確認する必要がありました。

バージョン 3.3.1 以降、プロダクトオブジェクトにはユーザーが対象の場合にのみオファーが含まれます。これにより、オファーが存在する場合はユーザーが対象であると仮定できるため、処理が簡素化されます。

購入処理を更新する

以前のバージョンでは、キャンセルされた購入と保留中の購入はエラーとして扱われ、それぞれコード 2: 'paymentCancelled'25: 'pendingPurchase' が返されていました。

バージョン 3.3.1 以降、キャンセルされた購入と保留中の購入は成功した結果として扱われ、それに応じて処理する必要があります。

try {
    const purchaseResult = await adapty.makePurchase(product);
    switch (purchaseResult.type) {
      case 'success':
        const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;

        if (isSubscribed) {
          // Grant access to the paid features
        }
        break;
      case 'user_cancelled':
        // Handle the case where the user canceled the purchase
        break;
      case 'pending':
        // Handle deferred purchases (e.g., the user will pay offline with cash)
        break;
    }
} catch (error) {
    // Handle the error
}

ペイウォールビルダーのペイウォール表示を更新する

更新されたコード例については、React Native でのペイウォールビルダーペイウォールの表示ドキュメントをご参照ください。

- import { createPaywallView } from '@adapty/react-native-ui';
+ import { createPaywallView } from 'react-native-adapty/dist/ui';

const view = await createPaywallView(paywall);

view.registerEventHandlers(); // handle close press, etc

try {
  await view.present();
} catch (error) {
  // handle the error
}

開発者定義タイマーの実装を更新する

timerInfo パラメーターを customTimers に名前変更してください。

- let timerInfo = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) }
+ let customTimers = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) }
 //and then you can pass it to createPaywallView as follows:
- view = await createPaywallView(paywall, { timerInfo })
+ view = await createPaywallView(paywall, { customTimers })

ペイウォールビルダーの購入イベントを修正する

以前の動作:

  • キャンセルされた購入は onPurchaseCancelled コールバックをトリガーしていました。
  • 保留中の購入はエラーコード 25: 'pendingPurchase' を返していました。

現在の動作:

  • 両方とも onPurchaseCompleted コールバックで処理されます。

移行手順:

  1. onPurchaseCancelled コールバックを削除する。
  2. 25: 'pendingPurchase' のエラーコード処理を削除する。
  3. onPurchaseCompleted コールバックを更新する。

const view = await createPaywallView(paywall);

const unsubscribe = view.registerEventHandlers({
  // ... other optional callbacks
  onPurchaseCompleted(purchaseResult, product) {
    switch (purchaseResult.type) {
      case 'success':
        const isSubscribed = purchaseResult.profile?.accessLevels['YOUR_ACCESS_LEVEL']?.isActive;

        if (isSubscribed) {
          // Grant access to the paid features
        }
        break;
      case 'user_cancelled':
        // Handle the case where the user canceled the purchase
        break;
      case 'pending':
        // Handle deferred purchases (e.g., the user will pay offline with cash)
        break;
    }
    return purchaseResult.type !== 'user_cancelled';
  },
});

ペイウォールビルダーのカスタムアクションイベントを修正する

削除されたコールバック:

  • onAction
  • onCustomEvent

追加されたコールバック:

  • 新しい onCustomAction(actionId) コールバック。カスタムアクションに使用してください。

onProductSelected コールバックを修正する

以前は、onProductSelectedproduct オブジェクトを必要としていました。現在は文字列として productId を必要とします。

updateProfile メソッドからサードパーティ連携パラメーターを削除する

サードパーティ連携の識別子は、setIntegrationIdentifier メソッドを使用して設定するようになりました。updateProfile メソッドはこれらを受け付けなくなりました。

サードパーティ連携 SDK の設定を更新する

Adapty React Native SDK 3.3.1 以降で連携が正しく機能するよう、以下のセクションで説明する各連携の SDK 設定を更新してください。

また、アトリビューション識別子の取得に AttributionSource を使用していた場合は、必要な識別子を文字列として提供するようにコードを変更してください。

Adjust

以下のようにモバイルアプリのコードを更新してください。完全なコード例については、Adjust 連携の SDK 設定をご確認ください。

 import { Adjust, AdjustConfig } from "react-native-adjust";
 import { adapty } from "react-native-adapty";

 var adjustConfig = new AdjustConfig(appToken, environment);

 // Before submiting Adjust config...
 adjustConfig.setAttributionCallbackListener(attribution => {
   // Make sure Adapty SDK is activated at this point
   // You may want to lock this thread awaiting of `activate`
   adapty.updateAttribution(attribution, "adjust");
 });

 // ...
 Adjust.create(adjustConfig);

+ Adjust.getAdid((adid) => {
+   if (adid)
+     adapty.setIntegrationIdentifier("adjust_device_id", adid);
+ });

AirBridge

以下のようにモバイルアプリのコードを更新してください。完全なコード例については、AirBridge 連携の SDK 設定をご確認ください。

 import Airbridge from 'airbridge-react-native-sdk';
 import { adapty } from 'react-native-adapty';

 try {
   const deviceId = await Airbridge.state.deviceUUID();

-  await adapty.updateProfile({
-    airbridgeDeviceId: deviceId,
-  });
+  await adapty.setIntegrationIdentifier("airbridge_device_id", deviceId);
 } catch (error) {
   // handle `AdaptyError`
 }

Amplitude

以下のようにモバイルアプリのコードを更新してください。完全なコード例については、Amplitude 連携の SDK 設定をご確認ください。

  import { adapty } from 'react-native-adapty';

 try {
-   await adapty.updateProfile({
-     amplitudeDeviceId: deviceId,
-     amplitudeUserId: userId,
-   });
+   await adapty.setIntegrationIdentifier("amplitude_device_id", deviceId);
+   await adapty.setIntegrationIdentifier("amplitude_user_id", userId);
 } catch (error) {
   // handle `AdaptyError`
 }

AppMetrica

以下のようにモバイルアプリのコードを更新してください。完全なコード例については、AppMetrica 連携の SDK 設定をご確認ください。

 import { adapty } from 'react-native-adapty';
 import AppMetrica, { DEVICE_ID_KEY, StartupParams, StartupParamsReason } from '@appmetrica/react-native-analytics';

 // ...
 const startupParamsCallback = async (
   params?: StartupParams,
   reason?: StartupParamsReason
 ) => {
   const deviceId = params?.deviceId
   if (deviceId) {
     try {
-       await adapty.updateProfile({
-         appmetricaProfileId: 'YOUR_ADAPTY_CUSTOMER_USER_ID',
-         appmetricaDeviceId: deviceId,
-       });
+       await adapty.setIntegrationIdentifier("appmetrica_profile_id", 'YOUR_ADAPTY_CUSTOMER_USER_ID');
+       await adapty.setIntegrationIdentifier("appmetrica_device_id", deviceId);
     } catch (error) {
       // handle `AdaptyError`
     }
   }
 }

 AppMetrica.requestStartupParams(startupParamsCallback, [DEVICE_ID_KEY])

AppsFlyer

以下のようにモバイルアプリのコードを更新してください。完全なコード例については、AppsFlyer 連携の SDK 設定をご確認ください。

 import { adapty, AttributionSource } from 'react-native-adapty';
 import appsFlyer from 'react-native-appsflyer';

 appsFlyer.onInstallConversionData(installData => {
     try {
-        const networkUserId = appsFlyer.getAppsFlyerUID();
-        adapty.updateAttribution(installData, AttributionSource.AppsFlyer, networkUserId);
+        const uid = appsFlyer.getAppsFlyerUID();
+        adapty.setIntegrationIdentifier("appsflyer_id", uid);
+        adapty.updateAttribution(installData, "appsflyer");
     } catch (error) {
         // handle the error
     }
 });

 // ...
 appsFlyer.initSdk(/*...*/);

Branch

以下のようにモバイルアプリのコードを更新してください。完全なコード例については、Branch 連携の SDK 設定をご確認ください。

 import { adapty, AttributionSource } from 'react-native-adapty';
 import branch from 'react-native-branch';

 branch.subscribe({
   enComplete: ({
     params,
   }) => {
-    adapty.updateAttribution(params, AttributionSource.Branch);
+    adapty.updateAttribution(params, "branch");
   },
 });

Facebook Ads

以下のようにモバイルアプリのコードを更新してください。完全なコード例については、Facebook Ads 連携の SDK 設定をご確認ください。

 import { adapty } from 'react-native-adapty';
 import { AppEventsLogger } from 'react-native-fbsdk-next';

 try {
   const anonymousId = await AppEventsLogger.getAnonymousID();

-  await adapty.updateProfile({
-    facebookAnonymousId: anonymousId,
-  });
+  await adapty.setIntegrationIdentifier("facebook_anonymous_id", anonymousId);
 } catch (error) {
   // handle `AdaptyError`
 }

Firebase と Google Analytics

以下のようにモバイルアプリのコードを更新してください。完全なコード例については、Firebase と Google Analytics 連携の SDK 設定をご確認ください。

 import analytics from '@react-native-firebase/analytics';
 import { adapty } from 'react-native-adapty';

 try {
   const appInstanceId = await analytics().getAppInstanceId();

-   await adapty.updateProfile({
-     firebaseAppInstanceId: appInstanceId,
-   });
+   await adapty.setIntegrationIdentifier("firebase_app_instance_id", appInstanceId);
 } catch (error) {
   // handle `AdaptyError`
 }

Mixpanel

以下のようにモバイルアプリのコードを更新してください。完全なコード例については、Mixpanel 連携の SDK 設定をご確認ください。

 import { adapty } from 'react-native-adapty';
 import { Mixpanel } from 'mixpanel-react-native';

 // ...
 try {
-   await adapty.updateProfile({
-     mixpanelUserId: mixpanelUserId,
-   });
+   await adapty.setIntegrationIdentifier("mixpanel_user_id", mixpanelUserId);
 } catch (error) {
   // handle `AdaptyError`
 }

OneSignal

以下のようにモバイルアプリのコードを更新してください。完全なコード例については、OneSignal 連携の SDK 設定をご確認ください。

Pushwoosh

以下のようにモバイルアプリのコードを更新してください。完全なコード例については、Pushwoosh 連携の SDK 設定をご確認ください。

 import { adapty } from 'react-native-adapty';
 import Pushwoosh from 'pushwoosh-react-native-plugin';

 // ...
 try {
-  await adapty.updateProfile({
-    pushwooshHWID: hwid,
-  });
+  await adapty.setIntegrationIdentifier("pushwoosh_hwid", hwid);
 } catch (error) {
   // handle `AdaptyError`
 }

オブザーバーモードの実装を更新する

ペイウォールとトランザクションのリンク方法を更新してください。以前は setVariationId メソッドを使用して variationId を割り当てていました。現在は、新しい reportTransaction メソッドを使用してトランザクションを記録する際に variationId を直接含めることができます。最終的なコード例については、オブザーバーモードでペイウォールを購入トランザクションに関連付けるをご確認ください。

reportTransaction メソッドを使用してトランザクションを記録することを忘れないでください。この手順をスキップすると、Adapty はトランザクションを認識できず、アクセスレベルの付与、アナリティクスへの反映、連携へのデータ送信が行われません。この手順は必須です!

reportTransaction メソッドのパラメーターの順序は setVariationId メソッドの順序と異なることにご注意ください。

  const variationId = paywall.variationId;

 try {
-    await adapty.setVariationId(variationId, transactionId);
+    await adapty.reportTransaction(transactionId, variationId);
 } catch (error) {
     // handle the `AdaptyError`
 }