ÿÿ åˆå›žèµ·å‹•時ã«AA対象ã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’表示ã™ã‚‹ | React Native SDK | Adapty ドキュメント

React Native SDKã§åˆå›žèµ·å‹•時ã«AA対象ã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’表示ã™ã‚‹

Apple Ads(AA)ã®ã‚¢ãƒˆãƒªãƒ“ューションã¯ã€adapty.activate() ã®å¾Œã«éžåŒæœŸã§å±Šãã¾ã™ã€‚åˆå›žèµ·å‹•時ã¯ã¾ã å±Šã„ã¦ã„ãªã„ã“ã¨ãŒå¤šã„ãŸã‚ã€getPaywall ã¯ãƒ‡ãƒ•ォルトã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚¨ãƒ³ã‚¹ã«å¯¾ã—ã¦è§£æ±ºã•れã€Apple Ads ユーザー㌠AA セグメント対象ã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’見逃ã—ã¦ã—ã¾ã„ã¾ã™ã€‚アトリビューションãŒå±Šãã¾ã§ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤ºã‚’é…らã›ã‚‹ã®ã§ã¯ãªãã€ã¾ãšã™ãã«ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’表示ã—ã€AA アトリビューションãŒé©ç”¨ã•れãŸã‚‰ãƒªãƒ•レッシュã™ã‚‹ã‚ˆã†ã«ã—ã¾ã—ょã†ã€‚ã“れã«ã‚ˆã‚Šã€Apple Ads ユーザーã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆå‘ã‘ã®ãƒãƒªã‚¢ãƒ³ãƒˆã‚’å—ã‘å–りã€ãれ以外ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯å¾…ãŸãšã«ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚AdaptyProfile.appliedAttributionSources ã§ AA アトリビューションãŒé©ç”¨ã•れãŸã‚¿ã‚¤ãƒŸãƒ³ã‚°ã‚’確èªã§ãã¾ã™ã€‚

å§‹ã‚ã‚‹å‰ã«

以下ãŒå¿…è¦ã§ã™ï¼š

  • Adapty React Native SDK 3.17.1 以é™ã€‚
  • Adapty ã§ã‚¢ãƒ—リ㮠Apple Ads ãŒè¨­å®šæ¸ˆã¿ã§ã‚ã‚‹ã“ã¨ã€‚Apple Ads ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

仕組ã¿

adapty.activate() ã®å¾Œã€SDK ã¯ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§ Apple ã‹ã‚‰ Apple Ads ã®ã‚¢ãƒˆãƒªãƒ“ューションをリクエストã—ã€ãã®çµæžœã‚’ Adapty ã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã«è»¢é€ã—ã¾ã™ã€‚AA ãŒãƒ—ロファイルã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¢ãƒˆãƒªãƒ“ューションソースã«ãªã‚‹ã¨ã€SDK 㯠onLatestProfileLoad ãƒªã‚¹ãƒŠãƒ¼ã«æ›´æ–°ã•れ㟠AdaptyProfile を届ã‘ã¾ã™ã€‚ã“ã®æ™‚点㧠appliedAttributionSources é…列㫠'apple_search_ads' ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚

ã“れã«ã‚ˆã‚Šã€ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®èª­ã¿è¾¼ã¿ã‚’2段階ã§è¡Œã†ã“ã¨ãŒã§ãã¾ã™ï¼š

  1. ã™ãã« getPaywall を呼ã³å‡ºã—ã¾ã™ã€‚アトリビューションãŒã¾ã é©ç”¨ã•れã¦ã„ãªã„ãŸã‚ã€Adapty ã¯ãƒ‡ãƒ•ォルトã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚¨ãƒ³ã‚¹ã«å¯¾ã—ã¦ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’解決ã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã™ãã«ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚
  2. 'apple_search_ads' ãŒç¾ã‚ŒãŸã‚‰ã€å†åº¦ getPaywall を呼ã³å‡ºã—ã¾ã™ã€‚Adapty ã¯ä»Šåº¦ã¯ Apple Ads ã®ã‚ªãƒ¼ãƒ‡ã‚£ã‚¨ãƒ³ã‚¹ã«å¯¾ã—ã¦ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’解決ã—ã€ã‚¿ãƒ¼ã‚²ãƒƒãƒˆå‘ã‘ã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’è¿”ã—ã¾ã™ã€‚ã“ã‚ŒãŒæœ€åˆã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã¨ç½®ãæ›ã‚りã¾ã™ã€‚

appliedAttributionSources ã¯ç©ºã¾ãŸã¯å­˜åœ¨ã—ãªã„å ´åˆãŒã‚りã¾ã™ã€‚ã“ã‚Œã¯æ¬¡ã®ã©ã¡ã‚‰ã‹ã‚’æ„味ã—ã¾ã™ï¼š

  • ã“ã®ãƒ—ロファイルã«å¯¾ã—㦠Apple Ads ã®ã‚¢ãƒˆãƒªãƒ“ューションãŒã¾ã å‡¦ç†ã•れã¦ã„ãªã„ã€ã¾ãŸã¯
  • アトリビューションãŒå…¨ã届ã„ã¦ã„ãªã„。

ã„ãšã‚Œã®å ´åˆã§ã‚‚ã€ã‚¹ãƒ†ãƒƒãƒ—1ã¯å®‰å…¨ã§ã™ã€‚Adapty ã¯ç¾åœ¨ã®ãƒ—ロファイル状態ã«åˆè‡´ã™ã‚‹ã‚ªãƒ¼ãƒ‡ã‚£ã‚¨ãƒ³ã‚¹ï¼ˆé€šå¸¸ã¯ãƒ‡ãƒ•ォルトオーディエンス)ã«å¯¾ã—ã¦ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’解決ã—ã¾ã™ã€‚ステップ2㯠'apple_search_ads' ãŒç¾ã‚ŒãŸã¨ãã ã‘実行ã•れã¾ã™ã€‚

ãã®å¾Œã®èµ·å‹•ã§ã¯ã€ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れãŸãƒ—ロファイルã«ã™ã§ã« appliedAttributionSources ã« 'apple_search_ads' ãŒå«ã¾ã‚Œã¦ã„ã‚‹ãŸã‚ã€æœ€åˆã® getPaywall ã‹ã‚‰ã™ã§ã« Apple Ads セグメント対象ã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãŒè¿”ã•れã¾ã™ã€‚2回目ã®ãƒ•ェッãƒã‚„見ãŸç›®ã®å¤‰åŒ–ã¯ç™ºç”Ÿã—ã¾ã›ã‚“。ã“ã®2段階ã®ãƒ•ローãŒé‡è¦ã«ãªã‚‹ã®ã¯ã€ã‚¢ãƒˆãƒªãƒ“ューションãŒã¾ã å‡¦ç†ä¸­ã®åˆå›žèµ·å‹•時ã®ã¿ã§ã™ã€‚

実装

ã™ãã«ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’表示ã—ã€'apple_search_ads' を監視ã—ã¦å±Šã„ãŸã‚‰ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’リフレッシュã—ã¾ã™ã€‚

  1. SDKを有効化ã—ã¾ã™ã€‚ React Native SDKã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã¨è¨­å®šã‚’å‚ç…§ã—ã¦ãã ã•ã„。
  2. 通常ã©ãŠã‚Š getPaywall ã§ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’読ã¿è¾¼ã‚“ã§è¡¨ç¤ºã—ã¾ã™ã€‚ アトリビューションを待ãŸãšã«é€²ã‚ã¦ãã ã•ã„。
  3. adapty.addEventListener('onLatestProfileLoad', …) ã§ãƒ—ãƒ­ãƒ•ã‚¡ã‚¤ãƒ«ã®æ›´æ–°ã‚’購読ã—ã€'apple_search_ads' を監視ã—ã¾ã™ã€‚ç¾ã‚ŒãŸã‚‰ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’å†åº¦ãƒ•ェッãƒã—ã€æ›´æ–°ã•れãŸã‚‚ã®ã‚’表示ã—ã¾ã™ã€‚リスナーをã¾ã è¨­å®šã—ã¦ã„ãªã„å ´åˆã¯ã€ã‚µãƒ–スクリプション更新ã®ãƒªãƒƒã‚¹ãƒ³ã‚’å‚ç…§ã—ã¦ãã ã•ã„:
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. タイムアウト後ã«ãƒªãƒƒã‚¹ãƒ³ã‚’åœæ­¢ã—ã¾ã™ã€‚ ã»ã¨ã‚“ã©ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ Apple Ads ã®ã‚¢ãƒˆãƒªãƒ“ューションをå—ã‘å–らãªã„ãŸã‚ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³å…¨ä½“ã§ãƒªã‚¹ãƒŠãƒ¼ã‚’é–‹ãç¶šã‘ã‚‹ã®ã§ã¯ãªãã€ã—ã°ã‚‰ãã—ãŸã‚‰ãƒªã‚¹ãƒŠãƒ¼ã‚’削除ã—ã¦ãã ã•ã„。リクエストãŒå¤±æ•—ã—ãŸå ´åˆã§ã‚‚ユーザーã«å¸¸ã«ä½•ã‹ãŒè¡¨ç¤ºã•れるよã†ã€ãã®ãƒ—レースメントã«ãƒ•ォールãƒãƒƒã‚¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’設定ã—ã¦ãã ã•ã„。

完全ãªå®Ÿè£…例

onAppleAdsAttribution 㯠Apple Ads ã®ã‚¢ãƒˆãƒªãƒ“ューションãŒé©ç”¨ã•れるã¨è§£æ±ºã—ã€timeoutMs 以内ã«å±Šã‹ãªã‘ã‚Œã°æ‹’å¦ã•れã¾ã™ã€‚以下ã®ä½¿ç”¨ä¾‹ã§ã¯ã€ã™ãã«ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’読ã¿è¾¼ã¿ã€ã‚¢ãƒˆãƒªãƒ“ューションãŒå±Šã„ãŸã‚‰å†ãƒ•ェッãƒã—ã¾ã™ã€‚Apple Ads ユーザーã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆå‘ã‘ã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’å—ã‘å–りã€ã‚¢ãƒˆãƒªãƒ“ューションãŒå±Šã‹ãªã‹ã£ãŸå ´åˆã¯æœ€åˆã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãŒãã®ã¾ã¾è¡¨ç¤ºã•れã¾ã™ï¼š


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

åˆå›žèµ·å‹•時ã€Apple Ads ユーザーã¯ãƒ‡ãƒ•ォルトã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãŒç½®ãæ›ã‚ã‚‹å‰ã«ä¸€çž¬è¡¨ç¤ºã•れるã“ã¨ãŒã‚りã¾ã™ã€‚ペイウォールビルダーã§ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’表示ã—ã¦ã„ã‚‹å ´åˆã¯ã€å†è¡¨ç¤ºãŒè¨±å®¹ã§ãã‚‹ã‹ã©ã†ã‹ã‚’検討ã™ã‚‹ã‹ã€ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãŒè¡¨ç¤ºã•れるå‰ã«ã‚¢ãƒƒãƒ—グレードをé©ç”¨ã—ã¦ãã ã•ã„。timeoutMs ã¯ã€ã©ã®ãらã„ã®é–“リッスンã—ç¶šã‘ã‚‹ã‹ã«åˆã‚ã›ã¦èª¿æ•´ã—ã¦ãã ã•ã„。届ãå ´åˆã®ã‚¢ãƒˆãƒªãƒ“ューションã¯é€šå¸¸ã€èµ·å‹•ã‹ã‚‰æ•°ç§’以内ã«å±Šãã¾ã™ã€‚

アプリãŒã™ã§ã«åˆ¥ã®ç›®çš„(ãŸã¨ãˆã°ã‚µãƒ–スクリプションステータスã®ç¢ºèªãªã©ï¼‰ã§ onLatestProfileLoad をリッスンã—ã¦ã„ã‚‹å ´åˆã¯ã€å¤‰æ›´ã®å¿…è¦ã¯ã‚りã¾ã›ã‚“。adapty.addEventListener ã¯è¤‡æ•°ã®ç‹¬ç«‹ã—ãŸãƒªã‚¹ãƒŠãƒ¼ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹ãŸã‚ã€æ—¢å­˜ã®ãƒªã‚¹ãƒŠãƒ¼ã«å½±éŸ¿ã‚’与ãˆã‚‹ã“ã¨ãªãã€ã“ã®ãƒªã‚¹ãƒŠãƒ¼ã‚’追加ã§ãã¾ã™ã€‚

ÿÿÿÿ