React Native SDK'da ilk başlatmada AA hedefli paywall gösterme

Apple Ads (AA) attribution, adapty.activate() çağrısından sonra eşzamansız olarak gelir. İlk açılışta henüz gelmemiş olacağından getPaywall, varsayılan kitleye göre çözümlenir ve Apple Ads kullanıcıları AA segmentli paywallı göremez. Paywall’ı attribution gelene kadar bekletmek yerine, hemen bir tane gösterin ve AA attribution uygulandıktan sonra yenileyin — böylece Apple Ads kullanıcıları hedeflenmiş varyantı görürken diğer kullanıcılar hiç beklemeden paywalllarına erişir. AdaptyProfile.appliedAttributionSources, AA attribution’ın ne zaman uygulandığını size bildirir.

Başlamadan önce

İhtiyacınız olanlar:

  • Adapty React Native SDK 3.17.1 veya üzeri.
  • Adapty’de uygulama için yapılandırılmış Apple Ads. Bkz. Apple Ads.

Nasıl çalışır

adapty.activate() çağrısının ardından SDK, arka planda Apple’dan Apple Ads attribution verisi talep eder ve sonucu Adapty’nin backend’ine iletir. AA, profil için etkin attribution kaynağı haline geldiğinde SDK, onLatestProfileLoad dinleyicinize güncellenmiş bir AdaptyProfile gönderir; bu profilin appliedAttributionSources dizisinde 'apple_search_ads' yer alır.

Bu sayede paywall’ı iki adımda yükleyebilirsiniz:

  1. Hemen getPaywall çağırın. Henüz attribution uygulanmadığından Adapty, isteği varsayılan kitleye göre çözümler ve kullanıcı hemen bir paywall görür.
  2. 'apple_search_ads' göründüğünde tekrar getPaywall çağırın. Adapty bu sefer isteği Apple Ads kitlesine göre çözümler ve hedeflenmiş paywallı döndürür; bu paywall ilkinin yerini alır.

appliedAttributionSources boş ya da eksik olabilir. Bu şu anlama gelir:

  • Bu profil için Apple Ads attribution’ı henüz işlenmemiştir, ya da
  • hiç attribution gelmemiştir. Her iki durumda da 1. adım güvenlidir — Adapty, isteği mevcut profil durumuna uyan kitleyle (genellikle varsayılan kitle) çözümler. 2. adım yalnızca 'apple_search_ads' göründüğünde çalışır.

Sonraki her başlatmada, önbelleğe alınmış profil zaten appliedAttributionSources içinde 'apple_search_ads' taşır; dolayısıyla ilk getPaywall çağrısı doğrudan Apple Ads segmentine göre paywall’ı döndürür — ikinci bir istek veya görünür bir değişiklik olmaz. İki adımlı flow yalnızca attribution henüz işlenirken, yani ilk başlatmada önem taşır.

Uygulama

Hemen bir paywall göster, ardından 'apple_search_ads' olayını dinle ve geldiğinde paywall’ı yenile.

  1. SDK’yı etkinleştirin. Bkz. React Native SDK’yı yükleyin ve yapılandırın.
  2. Bir paywall yükleyin ve gösteringetPaywall ile her zamanki gibi yapın, attribution için beklemeyin.
  3. Profil güncellemelerine abone olunadapty.addEventListener('onLatestProfileLoad', …) ile 'apple_search_ads' değerini takip edin. Bu değer göründüğünde, paywall’u tekrar çekip güncellenmiş olanı gösterin. Listener’ı henüz kurmadıysanız bkz. Abonelik güncellemelerini dinleyin:
const subscription = adapty.addEventListener('onLatestProfileLoad', async profile => {
  if (!profile.appliedAttributionSources?.includes('apple_search_ads')) return;
  const targeted = await adapty.getPaywall(placementId);
  // present the targeted paywall in place of the first one
});

// Call subscription.remove() after the upgrade, or after a timeout (see below).
  1. Zaman aşımından sonra dinlemeyi durdurun. Kullanıcıların büyük çoğunluğu Apple Ads attribution’ı hiçbir zaman almaz; bu nedenle dinleyiciyi tüm oturum boyunca açık tutmak yerine bir süre sonra kaldırın. İstek başarısız olduğunda kullanıcının her zaman bir şey görmesi için placement’a bir yedek paywall yapılandırın.

Eksiksiz örnek

onAppleAdsAttribution, Apple Ads attribution uygulandığında çözümlenir ya da timeoutMs süresi geçince reddedilir. Aşağıdaki kullanımda paywall hemen yüklenir, ardından attribution geldiğinde yeniden çekilir — Apple Ads kullanıcıları hedefli paywall’ı görür; attribution hiç gelmezse ilk paywall yerinde kalır:


const APPLE_ADS_SOURCE = 'apple_search_ads';
const placementId = 'YOUR_PLACEMENT_ID';

function hasAppleAdsAttribution(profile: AdaptyProfile): boolean {
  return profile.appliedAttributionSources?.includes(APPLE_ADS_SOURCE) ?? false;
}

/**
 * Resolves once Apple Ads attribution is applied to the profile.
 * Rejects with a timeout error if attribution never arrives within `timeoutMs`.
 * Call after `adapty.activate()`.
 */
export function onAppleAdsAttribution(timeoutMs: number): Promise<void> {
  return new Promise((resolve, reject) => {
    let timer: ReturnType<typeof setTimeout> | undefined;
    let subscription: { remove: () => void } | undefined;

    const stop = () => {
      clearTimeout(timer);
      subscription?.remove();
    };

    subscription = adapty.addEventListener('onLatestProfileLoad', profile => {
      if (!hasAppleAdsAttribution(profile)) return;
      stop();
      resolve();
    });

    timer = setTimeout(() => {
      stop();
      reject(new Error(`Apple Ads attribution timed out after ${timeoutMs}ms`));
    }, timeoutMs);
  });
}

let paywall = await adapty.getPaywall(placementId);

onAppleAdsAttribution(30_000)
  .then(() => adapty.getPaywall(placementId))
  .then(updated => {
    paywall = updated;
  })
  .catch(() => {
    console.log('Apple Ads attribution or loading failed');
  });

İlk açılışta Apple Ads kullanıcıları, varsayılan paywall’un değiştirilmeden önce kısa süreliğine görünmesine tanık olabilir. Paywall’ları Paywall Builder ile sunuyorsanız, yeniden sunumun kabul edilebilir olup olmadığına karar verin ya da güncellemeyi yalnızca paywall gösterilmeden önce uygulayın. timeoutMs değerini ne kadar süre dinlemeye hazır olduğunuza göre ayarlayın — gelen attribution verisi genellikle uygulamanın açılmasından sonraki birkaç saniye içinde ulaşır. Uygulamanız başka amaçlarla zaten onLatestProfileLoad dinliyorsa (örneğin, abonelik durumunu kontrol etmek için), bunu değiştirmenize gerek yok. adapty.addEventListener birden fazla bağımsız dinleyiciyi destekler, dolayısıyla bu kendi dinleyicisini mevcut olanları etkilemeden ekler.