React Native SDKで初回起動時にAA対象ペイウォールを表示する

この記事はアプリのiOSビルドに適用されます。Apple AdsのアトリビューションはiOSのみで利用できます。

Apple Ads(AA)のアトリビューションは、adapty.activate() の後に非同期で届きます。初回起動時はまだアトリビューションが届いていないことが多いため、getFlow はデフォルトのオーディエンスに対して解決され、Apple Ads ユーザーは AA セグメント向けのペイウォールを受け取れません。アトリビューションが届くまでペイウォールの表示を遅らせるのではなく、まず即座にペイウォールを表示し、AA アトリビューションが適用されたタイミングで更新することで、Apple Ads ユーザーはターゲット向けのバリアントを受け取りつつ、その他のユーザーは待ち時間なくペイウォールを見ることができます。AdaptyProfile.appliedExternalAttributionProviders を使うと、AA アトリビューションがいつ適用されたかを確認できます。

Important

このプロパティはApple Adsのみを報告します。他のプロバイダーからのアトリビューションはユーザープロファイルで確認でき、セグメントフィルターでも利用可能ですが、ここにはまだ表示されません。

始める前に

以下が必要です:

  • Adapty React Native SDK 4.1 以降。3.17.1〜4.0.x では、プロファイルプロパティの名前が appliedAttributionSources となっており、フローは getPaywall で取得します。
  • Adapty でアプリの Apple Ads が設定済みであること。詳しくは Apple Ads をご覧ください。

仕組み

adapty.activate() の呼び出し後、SDK はバックグラウンドで Apple Ads のアトリビューション情報を Apple に問い合わせ、その結果を Adapty のバックエンドに転送します。AA がプロファイルのアクティブなアトリビューションソースになると、SDK は更新された AdaptyProfileonLatestProfileLoad リスナーに配信します。このとき、appliedExternalAttributionProviders 配列には 'apple_search_ads' が含まれています。

これにより、ペイウォールを2ステップで読み込むことができます:

  1. すぐに getFlow を呼び出します。アトリビューションがまだ適用されていない状態では、Adapty はデフォルトのオーディエンスに対してリクエストを解決するため、ユーザーはすぐにペイウォールを見ることができます。
  2. 'apple_search_ads' が現れたら、再度 getFlow を呼び出します。Adapty は Apple Ads のオーディエンスに対してリクエストを解決し、ターゲット設定されたペイウォールを返します。これが最初のペイウォールと置き換わります。

appliedExternalAttributionProviders は空または存在しない場合があります。これは次のいずれかを意味します:

  • このプロファイルに対して Apple Ads のアトリビューションがまだ処理されていない。
  • アトリビューションがまったく届いていない。
  • 別のプロバイダーからアトリビューションが届いたが、この配列には含まれない。

いずれの場合も、ステップ 1 は安全です。Adapty は現在のプロファイル状態に一致するオーディエンス(通常はデフォルトオーディエンス)に基づいてリクエストを解決します。ステップ 2 は 'apple_search_ads' が現れた時点で一度だけ実行されます。

Important

その後のすべての起動では、キャッシュされたプロファイルにすでに appliedExternalAttributionProviders 内の 'apple_search_ads' が含まれているため、最初の getFlow でApple Ads向けセグメントのペイウォールが返されます。2回目のフェッチや表示上の変化は発生しません。この2ステップのフローが重要になるのは、アトリビューションがまだ処理中の初回起動時のみです。

実装

すぐにペイウォールを表示し、'apple_search_ads' を監視して届いたらペイウォールをリフレッシュします。

  1. SDKを有効化します。 React Native SDKのインストールと設定を参照してください。
  2. ペイウォールを読み込んで表示します。 getFlowを使って通常どおり表示し、アトリビューションを待たずに進みます。
  3. プロファイルの更新を購読します。 adapty.addEventListener('onLatestProfileLoad', …)を使い、'apple_search_ads'の出現を監視します。出現したらペイウォールを再取得し、更新されたものを表示します。リスナーをまだ設定していない場合は、サブスクリプション更新のリッスンを参照してください。
const subscription = adapty.addEventListener('onLatestProfileLoad', async profile => {
  if (!profile.appliedExternalAttributionProviders?.includes('apple_search_ads')) return;
  const targeted = await adapty.getFlow(placementId);
  // present the targeted paywall in place of the first one
});

// Call subscription.remove() after the upgrade, or after a timeout (see below).
  1. タイムアウト後にリッスンを停止します。 ほとんどのユーザーは Apple Ads のアトリビューションを受け取らないため、セッション全体でリスナーを開き続けるのではなく、しばらくしたらリスナーを削除してください。リクエストが失敗した場合でもユーザーに常に何かが表示されるよう、そのプレースメントにフォールバックペイウォールを設定してください。

完全な実装例

onAppleAdsAttribution は Apple Ads のアトリビューションが適用されると解決し、timeoutMs 以内に届かなければ拒否されます。以下の使用例では、すぐにペイウォールを読み込み、アトリビューションが届いたら再フェッチします。Apple Ads ユーザーはターゲット向けのペイウォールを受け取り、アトリビューションが届かなかった場合は最初のペイウォールがそのまま表示されます:


const APPLE_ADS_PROVIDER = 'apple_search_ads';
const placementId = 'YOUR_PLACEMENT_ID';

function hasAppleAdsAttribution(profile: AdaptyProfile): boolean {
  return profile.appliedExternalAttributionProviders?.includes(APPLE_ADS_PROVIDER) ?? 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 flow = await adapty.getFlow(placementId);

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

初回起動時、Apple Ads ユーザーはデフォルトのペイウォールが置き換わる前に一瞬表示されることがあります。ペイウォールビルダーでペイウォールを表示している場合は、再表示が許容できるかどうかを検討するか、ペイウォールが表示される前にアップグレードを適用してください。timeoutMs は、どのくらいの間リッスンし続けるかに合わせて調整してください。届く場合のアトリビューションは通常、起動から数秒以内に届きます。

アプリがすでに別の目的(たとえばサブスクリプションステータスの確認など)で onLatestProfileLoad をリッスンしている場合は、変更の必要はありません。adapty.addEventListener は複数の独立したリスナーをサポートしているため、既存のリスナーに影響を与えることなく、このリスナーを追加できます。