ÿÿ Capacitor ã§ã®ãƒ•ローã¨ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤º | Adapty ドキュメント

フローã¨ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤º - Capacitor

フローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’フローエビルダーã§ä½œæˆã—ãŸå ´åˆã€ãれをモãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã§ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã—ã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«è¡¨ç¤ºã™ã‚‹æ–¹æ³•ã‚’æ°—ã«ã™ã‚‹å¿…è¦ã¯ã‚りã¾ã›ã‚“。フローã«ã¯ã€è¡¨ç¤ºã™ã‚‹å†…容ã¨ãã®è¡¨ç¤ºæ–¹æ³•ã®ä¸¡æ–¹ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚

å§‹ã‚ã‚‹å‰ã«ã€ä»¥ä¸‹ã‚’確èªã—ã¦ãã ã•ã„。

  1. フローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’作æˆã—ã¦ã„る。
  2. プレースメントã«è¿½åŠ ã—ã¦ã„る。
  3. フローをフェッãƒã—ã¦ãƒ“ューを準備ã—ã¦ã„る。

ã“ã®ã‚¬ã‚¤ãƒ‰ã¯ãƒ•ローãŠã‚ˆã³ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ“ルダーã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«å°‚用ã§ã™ã€‚SDK v4.0以é™ãŒå¿…è¦ã§ã™ã€‚リモートコンフィグペイウォールã®è¡¨ç¤ºæ–¹æ³•ã¯ç•°ãªã‚Šã¾ã™ã€‚

フローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’スタンドアロン画é¢ã¨ã—ã¦è¡¨ç¤ºã™ã‚‹ã«ã¯ã€createFlowView メソッドã§ä½œæˆã—㟠view ã«å¯¾ã—㦠view.present() メソッドを使用ã—ã¾ã™ã€‚å„ view ã¯ä¸€åº¦ã—ã‹ä½¿ç”¨ã§ãã¾ã›ã‚“。フローをå†åº¦è¡¨ç¤ºã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€createFlowView ã‚’å†åº¦å‘¼ã³å‡ºã—ã¦æ–°ã—ã„ view インスタンスを作æˆã—ã¦ãã ã•ã„。

åŒã˜ view ã‚’å†ä½œæˆã›ãšã«å†åˆ©ç”¨ã™ã‚‹ã“ã¨ã¯ç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚エラーãŒç™ºç”Ÿã—ã¾ã™ã€‚


const view = await createFlowView(flow);

// Optional: handle flow events (close, purchase, restore, etc)
// await view.setEventHandlers({ ... });

try {
  await view.present();
} catch (error) {
  // handle the error
}

setEventHandlers を複数回呼ã³å‡ºã™ã¨ã€æŒ‡å®šã—ãŸãƒãƒ³ãƒ‰ãƒ©ãƒ¼ãŒä¸Šæ›¸ãã•れã€ãã®ã‚¤ãƒ™ãƒ³ãƒˆã«å¯¾ã™ã‚‹ãƒ‡ãƒ•ォルトãŠã‚ˆã³ä»¥å‰ã«è¨­å®šã—ãŸãƒãƒ³ãƒ‰ãƒ©ãƒ¼ãŒç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚

iOSã®ãƒ—レゼンテーションスタイルを設定ã™ã‚‹

present() メソッド㫠iosPresentationStyle パラメータを渡ã™ã“ã¨ã§ã€iOS ã§ã®ãƒ•ローã®è¡¨ç¤ºã‚¹ã‚¿ã‚¤ãƒ«ã‚’設定ã§ãã¾ã™ã€‚ã“ã®ãƒ‘ラメータ㯠'full_screen'(デフォルト)ã¾ãŸã¯ 'page_sheet' ã‚’å—ã‘付ã‘ã¾ã™ã€‚Android ã§ã¯ã€ãƒ•ローã¯å¸¸ã«ãƒ•ルスクリーンã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティã¨ã—ã¦è¡¨ç¤ºã•れã¾ã™ã€‚

try {
  await view.present({ iosPresentationStyle: 'page_sheet' });
} catch (error) {
  // handle the error
}

開発者定義タイマーを使用ã™ã‚‹

モãƒã‚¤ãƒ«ã‚¢ãƒ—リã§é–‹ç™ºè€…定義タイマーを使用ã™ã‚‹ã«ã¯ã€timerId(ã“ã®ä¾‹ã§ã¯ CUSTOM_TIMER_NY)を使用ã—ã¾ã™ã€‚ã“れ㯠Adapty ダッシュボードã§è¨­å®šã—ãŸé–‹ç™ºè€…定義タイマー㮠Timer ID ã§ã™ã€‚ã“れã«ã‚ˆã‚Šã€ã‚¢ãƒ—リã¯ã‚¿ã‚¤ãƒžãƒ¼ã‚’æ­£ã—ã„値(例:タイマーã®çµ‚了時刻(元日ãªã©ï¼‰ã‹ã‚‰ç¾åœ¨æ™‚刻を引ã„㟠13d 09h 03m 34s)ã§å‹•çš„ã«æ›´æ–°ã§ãã¾ã™ã€‚

const customTimers = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) };

const view = await createFlowView(flow, { customTimers });

ã“ã®ä¾‹ã§ã¯ã€CUSTOM_TIMER_NY 㯠Adapty ダッシュボードã§è¨­å®šã—ãŸé–‹ç™ºè€…定義タイマー㮠Timer ID ã§ã™ã€‚タイマーを使ã†ã“ã¨ã§ã€ã‚¢ãƒ—ãƒªãŒæ­£ã—ã„値(例: 13d 09h 03m 34sã€å…ƒæ—¥ãªã©ã®ã‚¿ã‚¤ãƒžãƒ¼çµ‚了時刻ã‹ã‚‰ç¾åœ¨æ™‚刻を引ã„ãŸå€¤ï¼‰ã‚’å‹•çš„ã«è¡¨ç¤ºã§ãã¾ã™ã€‚

ダイアログを表示ã™ã‚‹

Android ã§ãƒ•ロービューãŒè¡¨ç¤ºã•れã¦ã„ã‚‹å ´åˆã€ãƒã‚¤ãƒ†ã‚£ãƒ–ã®ã‚¢ãƒ©ãƒ¼ãƒˆãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã®ä»£ã‚りã«ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’使用ã—ã¦ãã ã•ã„。Android ã§ã¯ã€é€šå¸¸ã®ã‚¢ãƒ©ãƒ¼ãƒˆãŒãƒ•ロービューã®å¾Œã‚ã«è¡¨ç¤ºã•れるãŸã‚ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¯è¦‹ãˆã¾ã›ã‚“。ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’使用ã™ã‚‹ã“ã¨ã§ã€ã™ã¹ã¦ã®ãƒ—ラットフォームã§ãƒ•ローã®ä¸Šã«æ­£ã—ãダイアログãŒè¡¨ç¤ºã•れã¾ã™ã€‚

try {
  const action = await view.showDialog({
    title: 'Close paywall?',
    content: 'You will lose access to exclusive offers.',
    primaryActionTitle: 'Stay',
    secondaryActionTitle: 'Close',
  });

  if (action === 'secondary') {
    // User confirmed - close the flow
    await view.dismiss();
  }
  // If primary - do nothing, user stays
} catch (error) {
  // handle error
}

別ã®ã‚µãƒ–スクリプションã¸ã®åˆ‡ã‚Šæ›¿ãˆ

Android ã§ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒåˆ¥ã®ã‚µãƒ–スクリプションを有効ã«ã—ãŸçŠ¶æ…‹ã§æ–°ã—ã„サブスクリプションを購入ã—よã†ã¨ã™ã‚‹å ´åˆã€ãƒ•ロービューを作æˆã™ã‚‹éš›ã«ã‚µãƒ–スクリプション更新パラメータを渡ã™ã“ã¨ã§ã€æ–°ã—ã„購入ã®å‡¦ç†æ–¹æ³•を制御ã§ãã¾ã™ã€‚ç¾åœ¨ã®ã‚µãƒ–スクリプションを新ã—ã„ã‚‚ã®ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã«ã¯ã€createFlowView ã® productPurchaseParams ã« oldSubVendorProductId 㨠prorationMode パラメータを指定ã—ã¦ãã ã•ã„。


const productPurchaseParams = flow.paywalls
  .flatMap((paywall) => paywall.productIdentifiers)
  .map((productId) => {
    const params: MakePurchaseParamsInput = {};
    if (Capacitor.getPlatform() === 'android') {
      params.android = {
        subscriptionUpdateParams: {
          oldSubVendorProductId: 'PRODUCT_ID_OF_THE_CURRENT_ACTIVE_SUBSCRIPTION',
          prorationMode: 'with_time_proration',
        },
      };
    }
    return { productId, params };
  });

const view = await createFlowView(flow, { productPurchaseParams });

ペイウォールビルダーを使ã£ã¦ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’カスタマイズã—ãŸå ´åˆã€ãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã§ãれをレンダリングã—ã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«è¡¨ç¤ºã™ã‚‹æ‰‹é–“ã¯ã‚りã¾ã›ã‚“。ã“ã®ã‚ˆã†ãªãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã«ã¯ã€è¡¨ç¤ºã™ã‚‹å†…容ã¨è¡¨ç¤ºæ–¹æ³•ã®ä¸¡æ–¹ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚

ã“ã®ã‚¬ã‚¤ãƒ‰ã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ“ルダーã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«å°‚用ã§ã™ã€‚リモートコンフィグã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’表示ã™ã‚‹ãƒ—ロセスã¯ç•°ãªã‚Šã¾ã™ã€‚リモートコンフィグã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤ºã«ã¤ã„ã¦ã¯ã€ãƒªãƒ¢ãƒ¼ãƒˆã‚³ãƒ³ãƒ•ィグã§è¨­è¨ˆã—ãŸãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚’ã”覧ãã ã•ã„。

ペイウォールを表示ã™ã‚‹ã«ã¯ã€createPaywallView メソッドã§ä½œæˆã—㟠view ã«å¯¾ã—㦠view.present() メソッドを呼ã³å‡ºã—ã¾ã™ã€‚å„ view ã¯ä¸€åº¦ã—ã‹ä½¿ç”¨ã§ãã¾ã›ã‚“。ペイウォールをå†åº¦è¡¨ç¤ºã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€createPaywallView ã‚’ã‚‚ã†ä¸€åº¦å‘¼ã³å‡ºã—ã¦æ–°ã—ã„ view インスタンスを作æˆã—ã¦ãã ã•ã„。

åŒã˜ view ã‚’å†ä½œæˆã›ãšã«å†åˆ©ç”¨ã™ã‚‹ã¨ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹å ´åˆãŒã‚りã¾ã™ã€‚


const view = await createPaywallView(paywall);

view.setEventHandlers({
  onUrlPress(url) {
    window.open(url, '_blank');
    return false;
  },
});

try {
  await view.present();
} catch (error) {
  // handle the error
}

開発者定義タイマーを使用ã™ã‚‹

モãƒã‚¤ãƒ«ã‚¢ãƒ—リã§é–‹ç™ºè€…定義タイマーを使用ã™ã‚‹ã«ã¯ã€timerId(ã“ã®ä¾‹ã§ã¯ CUSTOM_TIMER_NY)を使用ã—ã¾ã™ã€‚ã“れã¯ã€Adapty ダッシュボードã§è¨­å®šã—ãŸé–‹ç™ºè€…定義タイマー㮠Timer ID ã§ã™ã€‚ã“れã«ã‚ˆã‚Šã€ã‚¢ãƒ—リã¯ã‚¿ã‚¤ãƒžãƒ¼ã‚’æ­£ã—ã„値(例:元旦ã¾ã§ã®æ®‹ã‚Šæ™‚é–“ã‚’ç¾åœ¨æ™‚刻ã‹ã‚‰å¼•ã„㟠13d 09h 03m 34s ãªã©ï¼‰ã§å‹•çš„ã«æ›´æ–°ã§ãã¾ã™ã€‚

const customTimers = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) };

const view = await createPaywallView(paywall, { customTimers });

ã“ã®ä¾‹ã§ã¯ã€CUSTOM_TIMER_NY 㯠Adapty ダッシュボードã§è¨­å®šã—ãŸé–‹ç™ºè€…定義タイマー㮠Timer ID ã§ã™ã€‚タイマーを使用ã™ã‚‹ã“ã¨ã§ã€ã‚¢ãƒ—ãƒªã¯æ­£ã—ã„値(例: 13d 09h 03m 34sã€ã‚¿ã‚¤ãƒžãƒ¼ã®çµ‚了時刻(元日ãªã©ï¼‰ã‹ã‚‰ç¾åœ¨æ™‚刻を引ã„ã¦ç®—出)ã§ã‚¿ã‚¤ãƒžãƒ¼ã‚’å‹•çš„ã«æ›´æ–°ã§ãã¾ã™ã€‚

ダイアログã®è¡¨ç¤º

Android ã§ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ“ューãŒè¡¨ç¤ºã•れã¦ã„ã‚‹å ´åˆã¯ã€ãƒã‚¤ãƒ†ã‚£ãƒ–ã®ã‚¢ãƒ©ãƒ¼ãƒˆãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã®ä»£ã‚りã«ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’使用ã—ã¦ãã ã•ã„。Android ã§ã¯ã€é€šå¸¸ã®ã‚¢ãƒ©ãƒ¼ãƒˆãŒãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ“ューã®èƒŒå¾Œã«è¡¨ç¤ºã•れã¦ã—ã¾ã„ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¯è¦‹ãˆãªããªã‚Šã¾ã™ã€‚ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’使用ã™ã‚‹ã“ã¨ã§ã€ã™ã¹ã¦ã®ãƒ—ラットフォームã§ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®ä¸Šã«æ­£ã—ãダイアログを表示ã§ãã¾ã™ã€‚

try {
  const action = await view.showDialog({
    title: 'Close paywall?',
    content: 'You will lose access to exclusive offers.',
    primaryActionTitle: 'Stay',
    secondaryActionTitle: 'Close',
  });

  if (action === 'secondary') {
    // User confirmed - close the paywall
    await view.dismiss();
  }
  // If primary - do nothing, user stays
} catch (error) {
  // handle error
}

iOSã®è¡¨ç¤ºã‚¹ã‚¿ã‚¤ãƒ«ã‚’設定ã™ã‚‹

present() メソッド㫠iosPresentationStyle パラメーターを渡ã™ã“ã¨ã§ã€iOSã§ã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤ºã‚¹ã‚¿ã‚¤ãƒ«ã‚’設定ã§ãã¾ã™ã€‚ã“ã®ãƒ‘ラメーターã«ã¯ 'full_screen'(デフォルト)ã¾ãŸã¯ 'page_sheet' を指定ã§ãã¾ã™ã€‚

await view.present({ iosPresentationStyle: 'page_sheet' });
ÿÿÿÿ