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.
- Adapty SDK v3.3.x’e yükseltin.
- Modelleri güncelleyin.
getProductsIntroductoryOfferEligibilitymetodunu kaldırın.- Satın alma işlemini güncelleyin.
- Paywall Builder paywall sunumunu güncelleyin.
- Geliştirici tanımlı zamanlayıcı uygulamasını gözden geçirin.
- Paywall Builder satın alma olaylarının işlenmesini güncelleyin.
- Paywall Builder özel eylem olaylarının işlenmesini güncelleyin.
onProductSelectedcallback’ini değiştirin.updateProfilemetodundan üçüncü taraf entegrasyon parametrelerini kaldırın.- 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.
- 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:
react-native-adaptypaketini 3.3.1 sürümüne güncelleyin.@adapty/react-native-uipaketini proje bağımlılıklarınızdan kaldırın.- Değişiklikleri uygulamak için proje bağımlılıklarınızı senkronize edin.
Modellerdeki değişiklikler
Yeni modeller
-
export interface AdaptySubscriptionOffer { readonly identifier: AdaptySubscriptionOfferId; phases: AdaptyDiscountPhase[]; android?: { offerTags?: string[]; }; } -
export type AdaptySubscriptionOfferId = | { id?: string; type: 'introductory'; } | { id: string; type: 'promotional' | 'win_back'; };
Değiştirilen modeller
-
-
subscriptionDetailsözelliğisubscriptionolarak yeniden adlandırıldı.
- subscriptionDetails?: AdaptySubscriptionDetails; + subscription?: AdaptySubscriptionDetails; -
-
-
promotionalOfferkaldırıldı. Artık promosyon teklifi yalnızca mevcutsaofferözelliği aracılığıyla iletilmektedir. Bu durumdaoffer?.identifier?.typedeğeri'promotional'olacaktır. -
introductoryOfferEligibilitykaldırıldı (teklifler yalnızca kullanıcı uygunsa döndürülür). -
offerIdkaldırıldı. Teklif kimliği artıkAdaptySubscriptionOffer.identifieriçinde saklanmaktadır. -
offerTags,AdaptySubscriptionOffer.androidiçine taşındı.
- introductoryOffers?: AdaptyDiscountPhase[]; + offer?: AdaptySubscriptionOffer; ios?: { - promotionalOffer?: AdaptyDiscountPhase; subscriptionGroupIdentifier?: string; }; android?: { - offerId?: string; basePlanId: string; - introductoryOfferEligibility: OfferEligibility; - offerTags?: string[]; renewalType?: 'prepaid' | 'autorenewable'; }; } -
-
-
identifieralanıAdaptyDiscountPhasemodelinden kaldırıldı. Teklif tanımlayıcısı artıkAdaptySubscriptionOffer.identifieriçinde saklanmaktadır.
- ios?: { - readonly identifier?: string; - }; -
Kaldırılan modeller
AttributionSource:- Daha önce
AttributionSource’un kullanıldığı yerlerde artık doğrudan string kullanılmaktadır.
- Daha önce
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
onPurchaseCancelledcallback’ini tetikliyordu. - Bekleyen satın almalar
25: 'pendingPurchase'hata kodunu döndürüyordu.
Şimdiki davranış:
- Her ikisi de
onPurchaseCompletedcallback’i tarafından işlenmektedir.
Geçiş adımları:
onPurchaseCancelledcallback’ini kaldırın.25: 'pendingPurchase'için hata kodu işlemesini kaldırın.onPurchaseCompletedcallback’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:
onActiononCustomEvent
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`
}