Adapty React Native SDK'yı v. 3.3'e Taşıma

Adapty SDK 3.3.1, bazı iyileştirmeler getiren önemli bir sürümdür ve sizden birkaç geçiş adımı gerektirebilir.

  1. Adapty SDK v3.3.x’e yükseltin.
  2. Modelleri güncelleyin.
  3. getProductsIntroductoryOfferEligibility metodunu kaldırın.
  4. Satın alma işlemini güncelleyin.
  5. Paywall Builder paywall sunumunu güncelleyin.
  6. Geliştirici tanımlı zamanlayıcı uygulamasını gözden geçirin.
  7. Paywall Builder satın alma olaylarının işlenmesini güncelleyin.
  8. Paywall Builder özel eylem olaylarının işlenmesini güncelleyin.
  9. onProductSelected callback’ini değiştirin.
  10. updateProfile metodundan üçüncü taraf entegrasyon parametrelerini kaldırın.
  11. Adjust, AirBridge, Amplitude, AppMetrica, Appsflyer, Branch, Facebook Ads, Firebase ve Google Analytics, Mixpanel, OneSignal ve Pushwoosh için entegrasyon yapılandırmalarını güncelleyin.
  12. Observer mode uygulamasını güncelleyin.

Adapty React Native SDK’yı 3.3.x’e yükseltme

3.3.1 sürümünden önce, react-native-adapty SDK’sı, Adapty’nin uygulamanızda düzgün çalışması için temel ve zorunlu SDK olarak hizmet ediyordu. @adapty/react-native-ui SDK’sı ise isteğe bağlıydı ve yalnızca Adapty Paywall Builder kullanıyorsanız gerekiyordu.

3.3.1 sürümünden itibaren @adapty/react-native-ui SDK’sı kullanımdan kaldırılmış olup işlevselliği react-native-adapty SDK’sına eklenmiştir. 3.3.1 sürümüne yükseltmek için şu adımları izleyin:

  1. react-native-adapty paketini 3.3.1 sürümüne güncelleyin.
  2. @adapty/react-native-ui paketini proje bağımlılıklarınızdan kaldırın.
  3. Değişiklikleri uygulamak için proje bağımlılıklarınızı senkronize edin.

Modellerdeki değişiklikler

Yeni modeller

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

Değiştirilen modeller

  1. AdaptyPaywallProduct:

    • subscriptionDetails özelliği subscription olarak yeniden adlandırıldı.

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

    • promotionalOffer kaldırıldı. Artık promosyon teklifi yalnızca mevcutsa offer özelliği aracılığıyla iletilmektedir. Bu durumda offer?.identifier?.type değeri 'promotional' olacaktır.

    • introductoryOfferEligibility kaldırıldı (teklifler yalnızca kullanıcı uygunsa döndürülür).

    • offerId kaldırıldı. Teklif kimliği artık AdaptySubscriptionOffer.identifier içinde saklanmaktadır.

    • offerTags, AdaptySubscriptionOffer.android içine taşındı.

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

    • identifier alanı AdaptyDiscountPhase modelinden kaldırıldı. Teklif tanımlayıcısı artık AdaptySubscriptionOffer.identifier içinde saklanmaktadır.

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

Kaldırılan modeller

  1. AttributionSource:
    • Daha önce AttributionSource’un kullanıldığı yerlerde artık doğrudan string kullanılmaktadır.
  2. OfferEligibility:
    • Bu model artık gerekli olmadığından kaldırılmıştır. Artık bir teklif yalnızca kullanıcı uygunsa döndürülmektedir.

getProductsIntroductoryOfferEligibility metodunu kaldırma

Adapty SDK 3.3.1 öncesinde, ürün nesneleri kullanıcının uygun olup olmadığından bağımsız olarak her zaman teklifleri içeriyordu. Bu durum, teklifi kullanmadan önce uygunluğu manuel olarak kontrol etmenizi gerektiriyordu.

3.3.1 sürümünden itibaren ürün nesnesi, teklifleri yalnızca kullanıcı uygunsa içermektedir. Bu sayede bir teklif mevcutsa kullanıcının uygun olduğunu varsayabilirsiniz; bu da süreci basitleştirir.

Satın alma işlemini güncelleme

Önceki sürümlerde iptal edilen ve bekleyen satın almalar hata olarak değerlendirilir ve sırasıyla 2: 'paymentCancelled' ile 25: 'pendingPurchase' kodları döndürülürdü.

3.3.1 sürümünden itibaren iptal edilen ve bekleyen satın almalar artık başarılı sonuçlar olarak kabul edilmekte ve buna göre işlenmesi gerekmektedir:

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
}

Paywall Builder paywall sunumunu güncelleme

Güncellenmiş örnekler için React Native’de yeni Paywall Builder paywalllerini sunma belgelerine bakın.

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

Geliştirici tanımlı zamanlayıcı uygulamasını güncelleme

timerInfo parametresini customTimers olarak yeniden adlandırın:

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

Paywall Builder satın alma olaylarını değiştirme

Önceki davranış:

  • İptal edilen satın almalar onPurchaseCancelled callback’ini tetikliyordu.
  • Bekleyen satın almalar 25: 'pendingPurchase' hata kodunu döndürüyordu.

Şimdiki davranış:

  • Her ikisi de onPurchaseCompleted callback’i tarafından işlenmektedir.

Geçiş adımları:

  1. onPurchaseCancelled callback’ini kaldırın.
  2. 25: 'pendingPurchase' için hata kodu işlemesini kaldırın.
  3. onPurchaseCompleted callback’ini güncelleyin:

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';
  },
});

Paywall Builder özel eylem olaylarını değiştirme

Kaldırılan callback’ler:

  • onAction
  • onCustomEvent

Eklenen callback:

  • Yeni onCustomAction(actionId) callback’i. Özel eylemler için bunu kullanın.

onProductSelected callback’ini değiştirme

Önceden onProductSelected, product nesnesini gerektiriyordu. Artık string olarak productId gerektirmektedir.

updateProfile metodundan üçüncü taraf entegrasyon parametrelerini kaldırma

Üçüncü taraf entegrasyon tanımlayıcıları artık setIntegrationIdentifier metodu kullanılarak ayarlanmaktadır. updateProfile metodu artık bunları kabul etmemektedir.

Üçüncü taraf entegrasyon SDK yapılandırmasını güncelleme

Adapty React Native SDK 3.3.1 ve sonraki sürümlerle entegrasyonların düzgün çalışmasını sağlamak için aşağıdaki bölümlerde açıklandığı gibi SDK yapılandırmalarınızı güncelleyin.

Ayrıca attribution tanımlayıcısını almak için AttributionSource kullandıysanız, gerekli tanımlayıcıyı string olarak sağlayacak şekilde kodunuzu değiştirin.

Adjust

Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için Adjust entegrasyonu için SDK yapılandırması bölümüne bakın.

 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

Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için AirBridge entegrasyonu için SDK yapılandırması bölümüne bakın.

 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

Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için Amplitude entegrasyonu için SDK yapılandırması bölümüne bakın.

  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

Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için AppMetrica entegrasyonu için SDK yapılandırması bölümüne bakın.

 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

Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için AppsFlyer entegrasyonu için SDK yapılandırması bölümüne bakın.

 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

Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için Branch entegrasyonu için SDK yapılandırması bölümüne bakın.

 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

Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için Facebook Ads entegrasyonu için SDK yapılandırması bölümüne bakın.

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

Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için Firebase ve Google Analytics entegrasyonu için SDK yapılandırması bölümüne bakın.

 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

Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için Mixpanel entegrasyonu için SDK yapılandırması bölümüne bakın.

 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

Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için OneSignal entegrasyonu için SDK yapılandırması bölümüne bakın.

Pushwoosh

Mobil uygulama kodunuzu aşağıda gösterildiği gibi güncelleyin. Tam kod örneği için Pushwoosh entegrasyonu için SDK yapılandırması bölümüne bakın.

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

Observer mode uygulamasını güncelleme

Paywalleri işlemlerle ilişkilendirme yönteminizi güncelleyin. Önceden variationId atamak için setVariationId metodunu kullanıyordunuz. Artık variationId’yi, yeni reportTransaction metodunu kullanarak işlemi kaydederken doğrudan ekleyebilirsiniz. Observer mode’da satın alma işlemlerini paywalllerle ilişkilendirme bölümündeki son kod örneğine bakın.

İşlemi reportTransaction metoduyla kaydetmeyi unutmayın. Bu adımı atlarsanız Adapty işlemi tanımaz, access level vermez, analitiklere dahil etmez ve entegrasyonlara göndermez. Bu adım zorunludur!

reportTransaction metodundaki parametre sırası setVariationId metodundakinden farklıdır.

  const variationId = paywall.variationId;

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