ÿÿ Flutter ã§ã®ã‚¤ãƒ™ãƒ³ãƒˆå‡¦ç† | Adapty ドキュメント

Flutter - フロー & ペイウォールイベントã®å‡¦ç†

ã“ã®ã‚¬ã‚¤ãƒ‰ã§ã¯ã€è³¼å…¥ãƒ»å¾©å…ƒãƒ»ãƒ—ãƒ­ãƒ€ã‚¯ãƒˆé¸æŠžãƒ»ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã®ã‚¤ãƒ™ãƒ³ãƒˆå‡¦ç†ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ビューを閉ã˜ã‚‹å‡¦ç†ã¨ãƒªãƒ³ã‚¯ã‚’é–‹ã処ç†ã¯ã€ãƒ‡ãƒ•ォルト㮠flowViewDidPerformAction 実装ã«ã‚ˆã£ã¦è¡Œã‚れã¾ã™ã€‚ã“れらをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ãŸã‚Šã€ã‚«ã‚¹ã‚¿ãƒ ãƒœã‚¿ãƒ³ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’処ç†ã—ãŸã‚Šã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€ãƒœã‚¿ãƒ³ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã®å‡¦ç†ã«é–¢ã™ã‚‹ã‚¬ã‚¤ãƒ‰ã‚’ã”覧ãã ã•ã„。

ビルダーã§è¨­å®šã—ãŸãƒ•ローやペイウォールã¯ã€è³¼å…¥ã‚„復元ã®ãŸã‚ã«è¿½åŠ ã®ã‚³ãƒ¼ãƒ‰ã¯ä¸è¦ã§ã™ã€‚ãŸã ã—ã€ã‚¢ãƒ—リãŒå¿œç­”ã§ãるイベントãŒã„ãã¤ã‹ç”Ÿæˆã•れã¾ã™ã€‚ã“れらã®ã‚¤ãƒ™ãƒ³ãƒˆã«ã¯ã€ãƒœã‚¿ãƒ³æŠ¼ä¸‹ï¼ˆé–‰ã˜ã‚‹ãƒœã‚¿ãƒ³ã€URLã€ãƒ—ãƒ­ãƒ€ã‚¯ãƒˆé¸æŠžãªã©ï¼‰ã‚„ã€ãƒ•ローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ä¸Šã§ã®è³¼å…¥é–¢é€£ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã®é€šçŸ¥ãŒå«ã¾ã‚Œã¾ã™ã€‚ã“れらã®ã‚¤ãƒ™ãƒ³ãƒˆã¸ã®å¯¾å¿œæ–¹æ³•ã«ã¤ã„ã¦ã¯ã€ä»¥ä¸‹ã‚’ã”確èªãã ã•ã„。

モãƒã‚¤ãƒ«ã‚¢ãƒ—リ内ã§ãƒ•ローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ç”»é¢ä¸Šã®å‡¦ç†ã‚’制御・監視ã™ã‚‹ã«ã¯ã€AdaptyUIFlowsEventsObserver ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装ã—ã€ç”»é¢ã‚’表示ã™ã‚‹å‰ã«ã‚ªãƒ–ザーãƒãƒ¼ã‚’設定ã—ã¦ãã ã•ã„。

AdaptyUI().setFlowsEventsObserver(this);

3ã¤ã®ã‚ªãƒ–ザーãƒãƒ¼ãƒ¡ã‚½ãƒƒãƒ‰ã¯å¿…é ˆã§ã™ — flowViewDidFinishPurchaseã€flowViewDidFinishRestoreã€flowViewDidReceiveError ãŒãªã„ã¨ã‚¯ãƒ©ã‚¹ãŒã‚³ãƒ³ãƒ‘イルã•れã¾ã›ã‚“。ãã®ä»–ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã™ã¹ã¦ä»»æ„ã§ã™ã€‚設定済ã¿ã®ã‚ªãƒ–ザーãƒãƒ¼ã‚’解除ã™ã‚‹ã«ã¯ã€setFlowsEventsObserver ã« null を渡ã—ã¦ãã ã•ã„。

Adapty SDK ãŒãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã«ã©ã®ã‚ˆã†ã«çµ±åˆã•れã¦ã„ã‚‹ã‹ã€å®Ÿéš›ã®ä¾‹ã‚’見ã¦ã¿ã¾ã›ã‚“ã‹ï¼Ÿãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤ºã€è³¼å…¥å‡¦ç†ã€ãã®ä»–ã®åŸºæœ¬æ©Ÿèƒ½ã‚’å«ã‚€å®Œå…¨ãªã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—を実演ã—ã¦ã„るサンプルアプリをã”覧ãã ã•ã„。

以下ã®ã‚¤ãƒ™ãƒ³ãƒˆä¾‹ã§ã¯ã€å„オブジェクトã§ä½¿ç”¨ã§ãるプロパティをコメント内ã®ä¾‹ç¤ºå€¤ã¨ã¨ã‚‚ã«ç¤ºã—ã¦ã„ã¾ã™ã€‚

ユーザー生æˆã‚¤ãƒ™ãƒ³ãƒˆ

ç”»é¢è¡¨ç¤º

ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€ãƒ•ローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®ãƒ“ューãŒç”»é¢ã«è¡¨ç¤ºã•れãŸã¨ãã«å‘¼ã³å‡ºã•れã¾ã™ã€‚

iOS ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«å†…ã®ã‚¦ã‚§ãƒ–ペイウォールボタンをタップã—ã€ã‚¢ãƒ—リ内ブラウザã§ã‚¦ã‚§ãƒ–ペイウォールãŒé–‹ã„ãŸã¨ãã«ã‚‚呼ã³å‡ºã•れã¾ã™ã€‚

void flowViewDidAppear(AdaptyUIFlowView view) {
}

ç”»é¢éžè¡¨ç¤º

ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€ãƒ•ローã¾ãŸã¯ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®ãƒ“ューãŒç”»é¢ã‹ã‚‰æ¶ˆãˆãŸã¨ãã«å‘¼ã³å‡ºã•れã¾ã™ã€‚

iOSã§ã¯ã€ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®ã‚¢ãƒ—リ内ブラウザã‹ã‚‰é–‹ã„ãŸã‚¦ã‚§ãƒ–ペイウォールãŒç”»é¢ã‹ã‚‰æ¶ˆãˆãŸå ´åˆã«ã‚‚呼ã³å‡ºã•れã¾ã™ã€‚

void flowViewDidDisappear(AdaptyUIFlowView view) {
}

プロダクトã®é¸æŠž

ユーザーã¾ãŸã¯ã‚·ã‚¹ãƒ†ãƒ ã«ã‚ˆã£ã¦ãƒ—ロダクトãŒé¸æŠžã•れãŸå ´åˆã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ï¼š

void flowViewDidSelectProduct(AdaptyUIFlowView view, String productId) {
}
イベントã®ä¾‹ï¼ˆã‚¯ãƒªãƒƒã‚¯ã—ã¦å±•開)
void flowViewDidSelectProduct(AdaptyUIFlowView view, String productId) {
  // productId is a String:
  productId; // 'premium_monthly'
}

購入ã®é–‹å§‹

ユーザーãŒè³¼å…¥ãƒ—ロセスを開始ã™ã‚‹ã¨ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ï¼š

void flowViewDidStartPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product) {
}
イベントã®ä¾‹ï¼ˆã‚¯ãƒªãƒƒã‚¯ã—ã¦å±•開)
void flowViewDidStartPurchase(AdaptyUIFlowView view, AdaptyPaywallProduct product) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId;        // 'premium_monthly'
  product.localizedTitle;         // 'Premium Monthly'
  product.localizedDescription;   // 'Premium subscription for 1 month'
  product.price.amount;           // 9.99            (double)
  product.price.currencyCode;     // 'USD'
  product.price.localizedString;  // '$9.99'
}

購入完了

ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯å¿…é ˆã§ã™ã€‚è³¼å…¥ãŒæˆåŠŸã—ãŸã¨ãã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè³¼å…¥ã‚’キャンセルã—ãŸã¨ãã€ã¾ãŸã¯è³¼å…¥ãŒä¿ç•™ä¸­ã¨åˆ¤æ–­ã•れãŸã¨ãã«å‘¼ã³å‡ºã•れã¾ã™ã€‚

void flowViewDidFinishPurchase(AdaptyUIFlowView view, 
                               AdaptyPaywallProduct product, 
                               AdaptyPurchaseResult purchaseResult) {
    switch (purchaseResult) {
      case AdaptyPurchaseResultSuccess(profile: final profile):
        // successful purchase
        break;
      case AdaptyPurchaseResultPending():
        // purchase is pending
        break;
      case AdaptyPurchaseResultUserCancelled():
        // user cancelled the purchase
        break;
      default:
        break;
    }
}
イベントã®ä¾‹ï¼ˆã‚¯ãƒªãƒƒã‚¯ã—ã¦å±•開)
void flowViewDidFinishPurchase(AdaptyUIFlowView view,
                               AdaptyPaywallProduct product,
                               AdaptyPurchaseResult purchaseResult) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId; // 'premium_monthly'

  switch (purchaseResult) {
    case AdaptyPurchaseResultSuccess(profile: final prÿÿofile):
      // profile — AdaptyProfile:
      profile.accessLevels['premium']?.isActive;  // true
      profile.accessLevels['premium']?.expiresAt; // DateTime(2027, 2, 15, 10, 30)
      break;
    case AdaptyPurchaseResultPending():
      // no additional data
      break;
    case AdaptyPurchaseResultUserCancelled():
      // no additional data
      break;
  }
}

v3 ã¨ã¯ç•°ãªã‚Šã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã«ã¯ãƒ‡ãƒ•ォルトã®å‹•作ãŒã‚りã¾ã›ã‚“ã€‚è³¼å…¥ãŒæˆåŠŸã—ã¦ã‚‚ç”»é¢ã¯è‡ªå‹•çš„ã«é–‰ã˜ã‚‰ã‚Œã¾ã›ã‚“。次ã®å‹•作ã¯è‡ªåˆ†ã§æ±ºã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚フローを続ã‘ã‚‹ã‹ã€view.dismiss() を呼ã³å‡ºã—ã¦ãã ã•ã„。画é¢ã‚’é–‰ã˜ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€ãƒœã‚¿ãƒ³ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¸ã®å¯¾å¿œã‚’å‚ç…§ã—ã¦ãã ã•ã„。

ウェブ決済ナビゲーションã®å®Œäº†

ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€ç‰¹å®šã®ãƒ—ロダクトã«å¯¾ã—ã¦ã‚¦ã‚§ãƒ–ペイウォールを開ã“ã†ã¨ã—ãŸå¾Œã«å‘¼ã³å‡ºã•れã¾ã™ã€‚ãƒŠãƒ“ã‚²ãƒ¼ã‚·ãƒ§ãƒ³ã®æˆåŠŸãƒ»å¤±æ•—ã«é–¢ã‚らãšã€ä¸¡æ–¹ã®ã‚±ãƒ¼ã‚¹ã§å‘¼ã³å‡ºã•れã¾ã™ã€‚

void flowViewDidFinishWebPaymentNavigation(AdaptyUIFlowView view, 
                                           AdaptyPaywallProduct? product, 
                                           AdaptyError? error) {
}

パラメーター:

パラメーター説明
productウェブペイウォールãŒé–‹ã‹ã‚ŒãŸ AdaptyPaywallProduct。null ã®å ´åˆãŒã‚りã¾ã™ã€‚
errorウェブペイウォールã®ãƒŠãƒ“ゲーションã«å¤±æ•—ã—ãŸå ´åˆã¯ AdaptyError オブジェクト。æˆåŠŸã—ãŸå ´åˆã¯ null。

購入失敗

ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€è³¼å…¥ãŒå¤±æ•—ã—ãŸå ´åˆï¼ˆä¾‹ï¼šæ±ºæ¸ˆã‚¨ãƒ©ãƒ¼ã‚„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ï¼‰ã«å‘¼ã³å‡ºã•れã¾ã™ã€‚ユーザーãŒè‡ªã‚‰ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã—ãŸå ´åˆã‚„ä¿ç•™ä¸­ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã«ã¯å‘¼ã³å‡ºã•れã¾ã›ã‚“—ãれらã¯flowViewDidFinishPurchaseã§å‡¦ç†ã•れã¾ã™ï¼š

void flowViewDidFailPurchase(AdaptyUIFlowView view, 
                             AdaptyPaywallProduct product, 
                             AdaptyError error) {
}

復元ã®é–‹å§‹

ユーザーãŒå¾©å…ƒãƒ—ロセスを開始ã—ãŸå ´åˆã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ï¼š

void flowViewDidStartRestore(AdaptyUIFlowView view) {
}

å¾©å…ƒã®æˆåŠŸ

ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯å¿…é ˆã§ã™ã€‚購入ã®å¾©å…ƒãŒæˆåŠŸã—ãŸå ´åˆã«å‘¼ã³å‡ºã•れã¾ã™ï¼š

void flowViewDidFinishRestore(AdaptyUIFlowView view, AdaptyProfile profile) {
}
イベントã®ä¾‹ï¼ˆã‚¯ãƒªãƒƒã‚¯ã—ã¦å±•開)
void flowViewDidFinishRestore(AdaptyUIFlowView view, AdaptyProfile profile) {
  // profile — AdaptyProfile:
  profile.accessLevels['premium']?.isActive;            // true
  profile.accessLevels['premium']?.expiresAt;           // DateTime(2027, 2, 15, 10, 30)
  profile.subscriptions['premium_monthly']?.isActive;   // true
  profile.subscriptions['premium_monthly']?.expiresAt;  // DateTime(2027, 2, 15, 10, 30)
}

ユーザーãŒå¿…è¦ãª accessLevel ã‚’æŒã£ã¦ã„ã‚‹å ´åˆã¯ã€ç”»é¢ã‚’é–‰ã˜ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ç¢ºèªæ–¹æ³•ã«ã¤ã„ã¦ã¯ サブスクリプションステータス ã‚’ã€ç”»é¢ã‚’é–‰ã˜ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ ボタンæ“作ã¸ã®å¯¾å¿œ ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

リストアã®å¤±æ•—

購入ã®ãƒªã‚¹ãƒˆã‚¢ã«å¤±æ•—ã—ãŸå ´åˆã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ï¼š

void flowViewDidFailRestore(AdaptyUIFlowView view, AdaptyError error) {
}

データã®å–å¾—ã¨ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°

プロダクト読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼

åˆæœŸåŒ–時ã«ãƒ—ロダクトé…列を渡ã•ãªã‹ã£ãŸå ´åˆã€AdaptyUI ã¯ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰å¿…è¦ãªã‚ªãƒ–ジェクトを自動的ã«å–å¾—ã—ã¾ã™ã€‚ã“ã®å‡¦ç†ãŒå¤±æ•—ã—ãŸå ´åˆã€AdaptyUI ã¯æ¬¡ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã—ã¦ã‚¨ãƒ©ãƒ¼ã‚’通知ã—ã¾ã™ã€‚

void flowViewDidFailLoadingProducts(AdaptyUIFlowView view, AdaptyError error) {
}

ビューã®ã‚¨ãƒ©ãƒ¼

ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯å¿…é ˆã§ã™ã€‚v3 ã® paywallViewDidFailRendering メソッドã®ä»£æ›¿ã¨ãªã‚Šã¾ã™ã€‚インターフェースã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ä¸­ã«ç™ºç”Ÿã—ãŸã‚¨ãƒ©ãƒ¼ã‚„ãã®ä»–ã®ãƒ“ューエラーã¯ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã™ã“ã¨ã§å ±å‘Šã•れã¾ã™ã€‚実装後ã®ç”»é¢ã®é–‰ã˜æ–¹ã¯ã”è‡ªèº«ã§æ±ºå®šã§ãã¾ã™ãŒã€ã“ã®ã‚ˆã†ãªã‚¨ãƒ©ãƒ¼æ™‚ã«ã¯ãƒ“ューを閉ã˜ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ã“れã¯ã€ã‚ªãƒ–ザーãƒãƒ¼ãŒè¨­å®šã•れã¦ã„ãªã„å ´åˆã® SDK 組ã¿è¾¼ã¿ã®ãƒ‡ãƒ•ォルト動作ã§ã‚‚ã‚りã¾ã™ï¼š

void flowViewDidReceiveError(AdaptyUIFlowView view, AdaptyError error) {
  // log the error and dismiss the broken view
  view.dismiss();
}

通常ã€ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚¨ãƒ©ãƒ¼ã¯ç™ºç”Ÿã—ãªã„ãŸã‚ã€ã‚‚ã—é­é‡ã—ãŸå ´åˆã¯ã”連絡ãã ã•ã„。

アナリティクスイベント

オプション㮠flowViewDidReceiveAnalyticEvent メソッドã¯ã€ãƒ•ローã‹ã‚‰ã®ã‚«ã‚¹ã‚¿ãƒ ã‚¢ãƒŠãƒªãƒ†ã‚£ã‚¯ã‚¹ã‚¤ãƒ™ãƒ³ãƒˆç”¨ã«äºˆç´„ã•れã¦ã„ã¾ã™ã€‚ç¾æ™‚点ã§ã¯ãƒ•ローã‹ã‚‰ã“ã®ã‚³ãƒ¼ãƒ‰ã¸ã®ã‚¤ãƒ™ãƒ³ãƒˆé€ä¿¡ã¯è¡Œã‚れãªã„ãŸã‚ã€å®Ÿè£…ã¯ä¸è¦ã§ã™ã€‚

オブザーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ã§è³¼å…¥ã‚’処ç†ã™ã‚‹

SDKをオブザーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ã§æœ‰åŠ¹åŒ–ã—ã€AdaptyãŒãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã™ã‚‹ãƒ•ローやペイウォールを表示ã—ã¦ã„ã‚‹å ´åˆã€SDKã¯ä»£ã‚りã«è³¼å…¥å‡¦ç†ã‚’行ã„ã¾ã›ã‚“。ユーザーãŒè³¼å…¥ãƒœã‚¿ãƒ³ã¾ãŸã¯å¾©å…ƒãƒœã‚¿ãƒ³ã‚’タップã™ã‚‹ã¨ã€SDKã¯ä»£ã‚りã«AdaptyUIObserverModeResolverを呼ã³å‡ºã—ã¾ã™ã€‚詳細ãªã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—手順ã«ã¤ã„ã¦ã¯ã€ã‚ªãƒ–ザーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ã§ãƒ•ローを表示ã™ã‚‹ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

システムリクエストã®å‡¦ç†

AdaptyUISystemRequestsHandler(AdaptyUI().setSystemRequestsHandler(...) ã§ç™»éŒ²ï¼‰ã¯ã€ãƒ•ローã‹ã‚‰ã®ã‚·ã‚¹ãƒ†ãƒ ãƒªã‚¯ã‚¨ã‚¹ãƒˆï¼ˆãƒ—ッシュ通知やカメラアクセスãªã©ã®OS権é™ãƒ—ロンプトã€App Storeレビューリクエスト)ã®ãŸã‚ã«äºˆç´„ã•れã¦ã„ã¾ã™ã€‚ç¾æ™‚点ã§ã¯ãƒ•ローãŒã“れらã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’トリガーã™ã‚‹ã“ã¨ã¯ãªã„ãŸã‚ã€ãƒãƒ³ãƒ‰ãƒ©ãƒ¼ã‚’登録ã™ã‚‹å¿…è¦ã¯ã‚りã¾ã›ã‚“。 handlePermission ã¯ã‚¯ãƒ©ã‚¹ã®å¿…須メソッドã§ã™ã€‚独自ã®ã‚³ãƒ¼ãƒ‰ã§ãƒ‘ーミッションをリクエストã—ã€AdaptyUIPermissionResult.granted() ã¾ãŸã¯ AdaptyUIPermissionResult.denied() ã‚’è¿”ã—ã¦ãã ã•ã„。handleAppReviewRequest ã¯ä»»æ„ã§ã™ã€‚

ã“ã®ã‚¬ã‚¤ãƒ‰ã§ã¯ã€è³¼å…¥ãƒ»å¾©å…ƒãƒ»ãƒ—ãƒ­ãƒ€ã‚¯ãƒˆé¸æŠžãƒ»ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã®ã‚¤ãƒ™ãƒ³ãƒˆå‡¦ç†ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ボタンæ“作(ペイウォールを閉ã˜ã‚‹ã€ãƒªãƒ³ã‚¯ã‚’é–‹ããªã©ï¼‰ã®å®Ÿè£…ã‚‚å¿…è¦ã§ã™ã€‚詳細ã¯ãƒœã‚¿ãƒ³ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã®å‡¦ç†ã«é–¢ã™ã‚‹ã‚¬ã‚¤ãƒ‰ã‚’ã”å‚ç…§ãã ã•ã„。

ペイウォールビルダーã§è¨­å®šã•れãŸãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã¯ã€è³¼å…¥ã‚„復元ã®ãŸã‚ã«è¿½åŠ ã®ã‚³ãƒ¼ãƒ‰ã¯ä¸è¦ã§ã™ã€‚ãŸã ã—ã€ã‚¢ãƒ—リãŒå¿œç­”ã§ãã‚‹ã„ãã¤ã‹ã®ã‚¤ãƒ™ãƒ³ãƒˆãŒç”Ÿæˆã•れã¾ã™ã€‚ã“れらã®ã‚¤ãƒ™ãƒ³ãƒˆã«ã¯ã€ãƒœã‚¿ãƒ³æŠ¼ä¸‹ï¼ˆé–‰ã˜ã‚‹ãƒœã‚¿ãƒ³ã€URLã€ãƒ—ãƒ­ãƒ€ã‚¯ãƒˆé¸æŠžãªã©ï¼‰ã‚„ã€ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ä¸Šã§ã®è³¼å…¥é–¢é€£ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã®é€šçŸ¥ãŒå«ã¾ã‚Œã¾ã™ã€‚ã“れらã®ã‚¤ãƒ™ãƒ³ãƒˆã¸ã®å¿œç­”方法ã«ã¤ã„ã¦ã¯ã€ä»¥ä¸‹ã‚’ã”覧ãã ã•ã„。

ã“ã®ã‚¬ã‚¤ãƒ‰ã¯ã€Adapty SDK v3.0 以é™ãŒå¿…è¦ãªæ–°ã—ã„ペイウォールビルダーã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«å°‚用ã§ã™ã€‚

ペイウォール画é¢ã§ç™ºç”Ÿã™ã‚‹ãƒ—ロセスを制御ã¾ãŸã¯ç›£è¦–ã™ã‚‹ã«ã¯ã€AdaptyUIPaywallsEventsObserver ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装ã—ã€ç”»é¢ã‚’表示ã™ã‚‹å‰ã«ã‚ªãƒ–ザーãƒãƒ¼ã‚’設定ã—ã¦ãã ã•ã„。

AdaptyUI().setPaywallsEventsObserver(this);

Adapty SDK ãŒãƒ¢ãƒã‚¤ãƒ«ã‚¢ãƒ—リã«ã©ã®ã‚ˆã†ã«çµ±åˆã•れã¦ã„ã‚‹ã‹ã€å®Ÿéš›ã®ä¾‹ã‚’見ã¦ã¿ã¾ã›ã‚“ã‹ï¼Ÿãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤ºã€è³¼å…¥å‡¦ç†ã€ãã®ä»–ã®åŸºæœ¬æ©Ÿèƒ½ã‚’å«ã‚€å®Œå…¨ãªã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—を実演ã—ã¦ã„るサンプルアプリをã”覧ãã ã•ã„。

以下ã®ã‚¤ãƒ™ãƒ³ãƒˆã®ä¾‹ã§ã¯ã€å„オブジェクトã§åˆ©ç”¨å¯èƒ½ãªãƒ—ロパティã¨ã€ã‚³ãƒ¡ãƒ³ãƒˆå†…ã®èª¬æ˜Žç”¨ã®å€¤ã‚’示ã—ã¦ã„ã¾ã™ã€‚

ユーザー生æˆã‚¤ãƒ™ãƒ³ãƒˆ

ペイウォールãŒè¡¨ç¤ºã•れãŸ

ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ“ューãŒç”»é¢ã«è¡¨ç¤ºã•れãŸã¨ãã«å‘¼ã³å‡ºã•れã¾ã™ã€‚

iOS ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«å†…ã®ã‚¦ã‚§ãƒ–ペイウォールボタンをタップã—ã¦ã‚¤ãƒ³ã‚¢ãƒ—リブラウザã§ã‚¦ã‚§ãƒ–ペイウォールãŒé–‹ã„ãŸå ´åˆã«ã‚‚呼ã³å‡ºã•れã¾ã™ã€‚

void paywallViewDidAppear(AdaptyUIPaywallView view) {
}

ペイウォールãŒéžè¡¨ç¤ºã«ãªã£ãŸ

ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ“ューãŒç”»é¢ã‹ã‚‰é–‰ã˜ã‚‰ã‚ŒãŸã¨ãã«å‘¼ã³å‡ºã•れã¾ã™ã€‚

iOSã§ã¯ã€ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«å†…ã®ã‚¢ãƒ—リ内ブラウザã§é–‹ã„ãŸã‚¦ã‚§ãƒ–ペイウォールãŒç”»é¢ã‹ã‚‰æ¶ˆãˆãŸã¨ãã«ã‚‚呼ã³å‡ºã•れã¾ã™ã€‚

void paywallViewDidDisappear(AdaptyUIPaywallView view) {
}

プロダクトã®é¸æŠž

ユーザーã¾ãŸã¯ã‚·ã‚¹ãƒ†ãƒ ã«ã‚ˆã£ã¦ãƒ—ロダクトãŒè³¼å…¥ã®ãŸã‚ã«é¸æŠžã•れるã¨ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ï¼š

void paywallViewDidSelectProduct(AdaptyUIPaywallView view, String productId) {
}
イベントã®ä¾‹ï¼ˆã‚¯ãƒªãƒƒã‚¯ã—ã¦å±•開)
void paywallViewDidSelectProduct(AdaptyUIPaywallView view, String productId) {
  // productId is a String:
  productId; // 'premium_monthly'
}

購入開始

ユーザーãŒè³¼å…¥ãƒ—ロセスを開始ã™ã‚‹ã¨ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ï¼š

void paywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product) {
}
イベントã®ä¾‹ï¼ˆã‚¯ãƒªãƒƒã‚¯ã—ã¦å±•開)
void paywallViewDidStartPurchase(AdaptyUIPaywallView view, AdaptyPaywallProduct product) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId;        // 'premium_monthly'
  product.localizedTitle;         // 'Premium Monthly'
  product.localizedDescription;   // 'Premium subscription for 1 month'
  product.price.amount;           // 9.99            (double)
  product.price.currencyCode;     // 'USD'
  product.price.localizedString;  // '$9.99'
}

購入完了

ã“ã®æ–¹æ³•ã¯ã€è³¼å…¥ãŒæˆåŠŸã—ãŸå ´åˆã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè³¼å…¥ã‚’キャンセルã—ãŸå ´åˆã€ã¾ãŸã¯è³¼å…¥ãŒä¿ç•™ä¸­ã¨åˆ¤æ–­ã•れãŸå ´åˆã«å‘¼ã³å‡ºã•れã¾ã™ã€‚

void paywallViewDidFinishPurchase(AdaptyUIPaywallView view, 
                                  AdaptyPaywallProduct product, 
                                  AdaptyPurchaseResult purchaseResult) {
    switch (purchaseResult) {
      case AdaptyPurchaseResultSuccess(profile: final profile):
        // successful purchase
        break;
      case AdaptyPurchaseResultPending():
        // purchase is pending
        break;
      case AdaptyPurchaseResultUserCancelled():
        // user cancelled the purchase
        break;
      default:
        break;
    }
}
イベントã®ä¾‹ï¼ˆã‚¯ãƒªãƒƒã‚¯ã—ã¦å±•開)
void paywallViewDidFinishPurchase(AdaptyUIPaywallView view,
                                  AdaptyPaywallProduct product,
                                  AdaptyPurchaseResult purchaseResult) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId; // 'premium_monthly'

  switch (purchaseResult) {
    case AdaptyPurchaseResultSuccess(profile: final profile):
      // profile — AdaptyProfile:
      profile.accessLevels['premium']?.isActive;  // true
      profile.accessLevels['premium']?.expiresAt; // DateTime(2027, 2, 15, 10, 30)
      break;
    case AdaptyPurchaseResultPending():
      // no additional data
      break;
    case AdaptyPurchaseResultUserCancelled():
      // no additional data
      break;
  }
}

ã“ã®ã‚ˆã†ãªå ´åˆã¯ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚’é–‰ã˜ã‚‹ã“ã¨ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚ペイウォール画é¢ã‚’é–‰ã˜ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€ãƒœã‚¿ãƒ³ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¸ã®å¯¾å¿œã‚’å‚ç…§ã—ã¦ãã ã•ã„。

ウェブ決済ナビゲーションã®å®Œäº†

ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€ç‰¹å®šã®ãƒ—ロダクトã«å¯¾ã—ã¦ã‚¦ã‚§ãƒ–ペイウォールを開ã“ã†ã¨ã—ãŸå¾Œã«å‘¼ã³å‡ºã•れã¾ã™ã€‚ãƒŠãƒ“ã‚²ãƒ¼ã‚·ãƒ§ãƒ³ã®æˆåŠŸãƒ»å¤±æ•—ã„ãšã‚Œã®å ´åˆã‚‚対象ã¨ãªã‚Šã¾ã™ã€‚

void paywallViewDidFinishWebPaymentNavigation(AdaptyUIPaywallView view, 
                                               AdaptyPaywallProduct? product, 
                                               AdaptyError? error) {
}

パラメーター:

パラメーター説明
productウェブペイウォールãŒé–‹ã‹ã‚ŒãŸ AdaptyPaywallProduct。null ã®å ´åˆãŒã‚りã¾ã™ã€‚
errorウェブペイウォールã®ãƒŠãƒ“ゲーションã«å¤±æ•—ã—ãŸå ´åˆã¯ AdaptyError オブジェクト。æˆåŠŸã—ãŸå ´åˆã¯ null。
イベント例(クリックã—ã¦å±•開)
void paywallViewDidFinishWebPaymentNavigation(AdaptyUIPaywallView view,
                                               AdaptyPaywallProduct? product,
                                               AdaptyError? error) {
  // product — AdaptyPaywallProduct?:
  product?.vendorProductId; // 'premium_monthly'

  if (error == null) {
    // navigation succeeded
  } else {
    // error — AdaptyError:
    error.code;    // AdaptyErrorCode.networkFailed (2005)
    error.message; // 'Network request failed'
    error.detail;  // platform-specific underlying error, or null
  }
}

購入失敗

ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯ã€æ”¯æ‰•ã„ã®å•題やãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ãªã©ã«ã‚ˆã‚Šè³¼å…¥ãŒå¤±æ•—ã—ãŸå ´åˆã«å‘¼ã³å‡ºã•れã¾ã™ã€‚ユーザーãŒè‡ªç™ºçš„ã«ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã—ãŸå ´åˆã‚„ペンディング中ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã«ã¯å‘¼ã³å‡ºã•れã¾ã›ã‚“。ãれら㯠paywallViewDidFinishPurchase ã§å‡¦ç†ã•れã¾ã™ï¼š

void paywallViewDidFailPurchase(AdaptyUIPaywallView view, 
                                AdaptyPaywallProduct product, 
                                AdaptyError error) {
}
イベントã®ä¾‹ï¼ˆã‚¯ãƒªãƒƒã‚¯ã—ã¦å±•開)
void paywallViewDidFailPurchase(AdaptyUIPaywallView view,
                                AdaptyPaywallProduct product,
                                AdaptyError error) {
  // product — AdaptyPaywallProduct:
  product.vendorProductId; // 'premium_monthly'

  // error — AdaptyError:
  error.code;    // AdaptyErrorCode.productPurchaseFailed (1006)
  error.message; // 'Product purchase failed.'
  error.detail;  // platform-specific underlying error, or null
}

復元ã®é–‹å§‹

ユーザーãŒå¾©å…ƒãƒ—ロセスを開始ã™ã‚‹ã¨ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ï¼š

void paywallViewDidStartRestore(AdaptyUIPaywallView view) {
}

復元æˆåŠŸ

購入ã®å¾©å…ƒãŒæˆåŠŸã™ã‚‹ã¨ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ï¼š

void paywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile) {
}
イベント例(クリックã—ã¦å±•開)
void paywallViewDidFinishRestore(AdaptyUIPaywallView view, AdaptyProfile profile) {
  // profile — AdaptyProfile:
  profile.accessLevels['premium']?.isActive;            // true
  profile.accessLevels['premium']?.expiresAt;           // DateTime(2027, 2, 15, 10, 30)
  profile.subscriptions['premium_monthly']?.isActive;   // true
  profile.subscriptions['premium_monthly']?.expiresAt;  // DateTime(2027, 2, 15, 10, 30)
}

ユーザーãŒå¿…è¦ãª accessLevel ã‚’æŒã£ã¦ã„ã‚‹å ´åˆã¯ã€ç”»é¢ã‚’é–‰ã˜ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚ç¢ºèªæ–¹æ³•ã«ã¤ã„ã¦ã¯ サブスクリプションã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ ã‚’ã€ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ç”»é¢ã‚’é–‰ã˜ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ ボタンæ“作ã¸ã®å¯¾å¿œ ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

復元ã®å¤±æ•—

購入ã®å¾©å…ƒã«å¤±æ•—ã—ãŸå ´åˆã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒå‘¼ã³å‡ºã•れã¾ã™ï¼š

void paywallViewDidFailRestore(AdaptyUIPaywallView view, AdaptyError error) {
}
イベントã®ä¾‹ï¼ˆã‚¯ãƒªãƒƒã‚¯ã—ã¦å±•開)
void paywallViewDidFailRestore(AdaptyUIPaywallView view, AdaptyError error) {
  // error — AdaptyError:
  error.code;    // AdaptyErrorCode.receiveRestoredTransactionsFailed (1011)
  error.message; // 'Error occurred in the process of restoring purchases.'
  error.detail;  // platform-specific underlying error, or null
}

データã®å–å¾—ã¨ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°

プロダクト読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼

åˆæœŸåŒ–時ã«ãƒ—ロダクトé…列を渡ã•ãªã‹ã£ãŸå ´åˆã€AdaptyUIã¯ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰å¿…è¦ãªã‚ªãƒ–ジェクトを自動的ã«å–å¾—ã—ã¾ã™ã€‚ã“ã®å‡¦ç†ãŒå¤±æ•—ã—ãŸå ´åˆã€AdaptyUIã¯ä»¥ä¸‹ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã—ã¦ã‚¨ãƒ©ãƒ¼ã‚’通知ã—ã¾ã™ï¼š

void paywallViewDidFailLoadingProducts(AdaptyUIPaywallView view, AdaptyError error) {
}
イベント例(クリックã—ã¦å±•開)
void paywallViewDidFailLoadingProducts(AdaptyUIPaywallView view, AdaptyError error) {
  // error — AdaptyError:
  error.code;    // AdaptyErrorCode.productRequestFailed (1002)
  error.message; // 'Unable to fetch available In-App Purchase products at the moment.'
  error.detail;  // platform-specific underlying error, or null
}

レンダリングエラー

インターフェースã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã™ã“ã¨ã§ã‚¨ãƒ©ãƒ¼ãŒå ±å‘Šã•れã¾ã™ã€‚デフォルトã§ã¯ï¼ˆv3.15.2以é™ï¼‰ã€ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã¨ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã¯è‡ªå‹•çš„ã«é–‰ã˜ã‚‰ã‚Œã¾ã™ãŒã€å¿…è¦ã«å¿œã˜ã¦ã“ã®å‹•作をオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã§ãã¾ã™ã€‚

void paywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error) {
  // Default behavior: view.dismiss()
  // Override with custom logic if needed, for example:
  // - Log the error
  // - Show an error message to the user
}
イベントã®ä¾‹ï¼ˆã‚¯ãƒªãƒƒã‚¯ã—ã¦å±•開)
void paywallViewDidFailRendering(AdaptyUIPaywallView view, AdaptyError error) {
  // error — AdaptyError:
  error.code;    // AdaptyErrorCode.jsException (4105)
  error.message; // 'An exception was thrown from JS during AdaptyUI flow execution.'
  error.detail;  // platform-specific underlying error, or null

  // Default behavior: view.dismiss()
}

通常ã®çжæ³ã§ã¯ã€ã“ã®ã‚ˆã†ãªã‚¨ãƒ©ãƒ¼ã¯ç™ºç”Ÿã—ãªã„ã¯ãšã§ã™ã€‚ã‚‚ã—é­é‡ã—ãŸå ´åˆã¯ã€ãœã²ã”連絡ãã ã•ã„。

ÿÿÿÿ