Capacitor SDKでエラーを処理する

SDKが返すエラーはすべて AdaptyError インスタンスです。以下はその例です。

Tip

デバッグ前に詳細ログを有効にしてください。 ほとんどの AdaptyError は、StoreKit、Play Billing、ネットワーク、またはバックエンドのエラーをラップしています。詳細ログを有効にすると(adapty.setLogLevel({ logLevel: 'verbose' })ログ設定を参照)、ラップされたエラーがコンソールに出力され、実際の原因がわかります。AdaptyErrordetail プロパティはログレベルに関係なく値が入っていますが、詳細ログを使うとコンソールにも表示されます。


try {
  const result = await adapty.makePurchase({ product });
  
  // Handle purchase result
  if (result.type === 'success') {
    console.log('Purchase successful:', result.profile);
  } else if (result.type === 'user_cancelled') {
    console.log('User cancelled the purchase');
  } else if (result.type === 'pending') {
    console.log('Purchase is pending');
  }
} catch (error) {
  if (error instanceof AdaptyError) {
    console.error('Adapty error:', error.adaptyCode, error.localizedDescription);
    
    // Handle specific error codes
    switch (error.adaptyCode) {
      case ErrorCodeName.cantMakePayments:
        console.log('In-app purchases are not allowed on this device');
        break;
      case ErrorCodeName.notActivated:
        console.log('Adapty SDK is not activated');
        break;
      case ErrorCodeName.productPurchaseFailed:
        console.log('Purchase failed:', error.detail);
        break;
      default:
        console.log('Other error occurred:', error.detail);
    }
  } else {
    console.error('Non-Adapty error:', error);
  }
}

エラープロパティ

AdaptyErrorクラスは以下のプロパティを提供します:

プロパティ説明
adaptyCodenumber数値エラーコード(例:cantMakePaymentsの場合は1003
localizedDescriptionstringユーザー向けのエラーメッセージ
detailstring | undefined追加のエラー詳細(任意)
messagestringコードと説明を含む完全なエラーメッセージ

エラーコード

SDKはエラーコードを扱うための定数とユーティリティをエクスポートしています:

ErrorCodeName定数

文字列識別子を数値コードにマッピングします:


ErrorCodeName.cantMakePayments // 1003
ErrorCodeName.notActivated // 2002
ErrorCodeName.networkFailed // 2005

ErrorCode定数

数値コードを文字列識別子にマッピングします:


ErrorCode[1003] // 'cantMakePayments'
ErrorCode[2002] // 'notActivated'
ErrorCode[2005] // 'networkFailed'

ヘルパー関数


// Get numeric code from string name:
getErrorCode('cantMakePayments') // 1003

// Get string name from numeric code:
getErrorPrompt(1003) // 'cantMakePayments'

エラーコードの比較

重要: error.adaptyCode数値なので、数値コードと直接比較してください:

// Option 1: Use ErrorCodeName constant (recommended) ✅
if (error.adaptyCode === ErrorCodeName.cantMakePayments) {
  console.log('Cannot make payments');
}

// Option 2: Compare with numeric literal ✅
if (error.adaptyCode === 1003) {
  console.log('Cannot make payments');
}

// NOT like this ❌ - compares number to string and will never match
if (error.adaptyCode === ErrorCode[1003]) {
}

グローバルエラーハンドラー

すべての Adapty エラーをキャッチするグローバルエラーハンドラーを設定できます。


// Set up global error handler
AdaptyError.onError = (error: AdaptyError) => {
  console.error('Global Adapty error:', {
    code: error.adaptyCode,
    message: error.localizedDescription,
    detail: error.detail
  });
  
  // Handle specific error types globally
  if (error.adaptyCode === ErrorCodeName.notActivated) {
    // SDK not activated - maybe retry activation
    console.log('SDK not activated, attempting to reactivate...');
  }
};

よくあるエラー処理パターン

購入エラーの処理


async function handlePurchase(product: AdaptyPaywallProduct) {
  try {
    const result = await adapty.makePurchase({ product });
    
    if (result.type === 'success') {
      console.log('Purchase successful:', result.profile);
    } else if (result.type === 'user_cancelled') {
      console.log('User cancelled the purchase');
    } else if (result.type === 'pending') {
      console.log('Purchase is pending');
    }
  } catch (error) {
    if (error instanceof AdaptyError) {
      switch (error.adaptyCode) {
        case ErrorCodeName.cantMakePayments:
          console.log('In-app purchases not allowed');
          break;
        case ErrorCodeName.productPurchaseFailed:
          console.log('Purchase failed:', error.detail);
          break;
        default:
          console.error('Purchase error:', error.localizedDescription);
      }
    }
  }
}

ネットワークエラーへの対処


async function fetchFlow(placementId: string) {
  try {
    const flow = await adapty.getFlow({ placementId });
    return flow;
  } catch (error) {
    if (error instanceof AdaptyError) {
      switch (error.adaptyCode) {
        case ErrorCodeName.networkFailed:
          console.log('Network error, retrying...');
          // Implement retry logic
          break;
        case ErrorCodeName.serverError:
          console.log('Server error:', error.detail);
          break;
        case ErrorCodeName.notActivated:
          console.log('SDK not activated');
          break;
        default:
          console.error('Paywall fetch error:', error.localizedDescription);
      }
    }
    throw error;
  }
}

システム StoreKit コード

エラーコード説明
unknown0不明または予期しないエラーが発生したことを示します。
clientInvalid1クライアントが試みた操作を実行する権限がないことを示します。
paymentCancelled2

ユーザーが支払いリクエストをキャンセルしたことを示します。

対応は不要ですが、ビジネスロジックの観点から、割引を提供したり後でリマインドしたりすることができます。

paymentInvalid3支払いパラメーターのいずれかがストアで認識されなかったことを示します。
paymentNotAllowed4

ユーザーが支払いを承認する権限を持っていないことを示します。考えられる原因:

- ユーザーの国では支払いがサポートされていない。

- ユーザーが未成年である。

storeProductNotAvailable5リクエストされたプロダクトが App Store に存在しないことを示します。該当の国でプロダクトが利用可能かどうかを確認してください。
cloudServicePermissionDenied6ユーザーがクラウドサービス情報へのアクセスを許可していないことを示します。
cloudServiceNetworkConnectionFailed7デバイスがネットワークに接続できなかったことを示します。
cloudServiceRevoked8ユーザーがこのクラウドサービスの使用許可を取り消したことを示します。
privacyAcknowledgementRequired9ユーザーがストアのプライバシーポリシーにまだ同意していないことを示します。
unauthorizedRequestData10リクエストが正しく構築されていないことを示します。
invalidOfferIdentifier11

オファー識別子が無効です。考えられる原因:

- その識別子のオファーが App Store に設定されていない。

- オファーが取り消されている。

- オファー ID の入力ミスがある。

invalidSignature12支払い割引のシグネチャが無効であることを示します。In-app purchase Key ID フィールドへの入力と In-App Purchase Private Key ファイルのアップロードが完了しているか確認してください。詳細は App Store インテグレーションの設定 をご覧ください。
missingOfferParams13

Adapty インテグレーションまたはオファーに問題があることを示します。

設定方法については App Store インテグレーションの設定 および オファー をご覧ください。

invalidOfferPrice14ストアで指定した価格が無効になったことを示します。オファーは常に割引価格を設定する必要があります。

カスタム Android コード

エラーコード説明
adaptyNotInitialized20activate メソッドを使用して Adapty SDK を正しく設定する必要があります。設定方法は Adapty SDK のインストールと設定 をご覧ください。
productNotFound22購入対象のプロダクトがストアで利用できないことを示します。
currentSubscriptionToUpdateNotFoundInHistory24更新対象の元のサブスクリプションが見つかりません。
billingServiceTimeout97Google Play が応答する前にリクエストが最大タイムアウトに達したことを示します。Play Billing Library の呼び出しによってリクエストされた操作の実行に遅延が発生した場合などに起こります。
featureNotSupported98リクエストされた機能が現在のデバイスの Play Store でサポートされていません。
billingServiceDisconnected99クライアントアプリと Google Play Store サービス間の BillingClient 経由の接続が切断されたことを示す致命的なエラーです。
billingServiceUnavailable102Google Play Billing サービスが現在利用できないことを示す一時的なエラーです。ほとんどの場合、クライアントデバイスと Google Play Billing サービス間のどこかでネットワーク接続の問題が発生しています。
billingUnavailable103

購入プロセス中にユーザーの請求エラーが発生したことを示します。発生する例:

1. ユーザーのデバイス上の Play Store アプリが古い。

2. ユーザーがサポートされていない国にいる。

3. ユーザーが企業ユーザーであり、企業の管理者がユーザーの購入を無効にしている。

4. Google Play がユーザーの支払い方法に請求できない(例:クレジットカードの有効期限切れ)。

5. ユーザーが Play Store アプリにログインしていない。

developerError105API の不正な使用を示す致命的なエラーです。
billingError106Google Play 自体の内部問題を示す致命的なエラーです。
itemAlreadyOwned107消耗型アイテムがすでに購入済みです。
itemNotOwned108アイテムに対するリクエストされた操作が失敗したことを示します。
billingNetworkError112デバイスと Play システム間のネットワーク接続に問題が発生したことを示します。

カスタム StoreKit コード

エラーコード説明
noProductIDsFound1000

ペイウォール内のどのプロダクトもストアで利用できないことを示します。

このエラーが発生した場合は、以下の手順で解決してください:

1. すべてのプロダクトが Adapty ダッシュボードに追加されているか確認する。

2. アプリの Bundle ID が Apple Connect のものと一致しているか確認する。

3. アプリストアのプロダクト識別子がダッシュボードに追加した識別子と一致しているか確認する。なお、Bundle ID がすでにストアに含まれている場合を除き、識別子に Bundle ID を含めないでください。

4. Apple の税務設定でアプリの有料ステータスがアクティブになっているか確認する。税務情報が最新で証明書が有効であることを確認する。

5. アプリに銀行口座が紐付けられており、収益化が可能な状態かどうかを確認する。

6. プロダクトがすべての地域で利用可能かどうかを確認する。また、プロダクトが “Ready to Submit” の状態になっているか確認する。

productRequestFailed1002

現時点で利用可能なプロダクトを取得できません。考えられる原因:

- キャッシュがまだ作成されておらず、かつインターネット接続もない。

cantMakePayments1003このデバイスではアプリ内課金が許可されていません。
noPurchasesToRestore1004Google Play が復元対象の購入を見つけられなかったことを示します。
cantReadReceipt1005

デバイスに有効なレシートがありません。サンドボックステスト中に発生することがあります。

対応は不要ですが、ビジネスロジックの観点から、割引を提供したり後でリマインドしたりすることができます。

productPurchaseFailed1006プロダクトの購入に失敗しました。これは基礎となる StoreKit エラーをラップしています。実際の原因を確認するには、ラップされたエラーを参照するか、詳細ログを有効にしてコンソールで確認してください。ラップされたエラーは通常、上記の表にある StoreKit コード 0〜14 のいずれかで、最も多いのは paymentCancelledpaymentInvalidpaymentNotAllowed、または invalidOfferPrice です。特定の原因が特定できない場合は、新しいサンドボックスプロファイルで試してみてください。それでも失敗する場合は Apple サポートにお問い合わせください。
refreshReceiptFailed1010レシートを受信できなかったことを示します。StoreKit 1 にのみ適用されます。
receiveRestoredTransactionsFailed1011購入の復元に失敗しました。

カスタムネットワークコード

エラーコード説明
notActivated2002activate メソッドを使用して Adapty SDK を正しく設定する必要があります。設定方法は Adapty SDK のインストールと設定 をご覧ください。
badRequest2003不正なリクエストです。
serverError2004サーバーエラーです。
networkFailed2005ネットワークリクエストが失敗しました。
decodingFailed2006レスポンスのデコードに失敗したことを示します。
encodingFailed2009リクエストのエンコードに失敗したことを示します。
analyticsDisabled3000アナリティクスをオプトアウトしているため、アナリティクスイベントを処理できません。詳細は アナリティクスインテグレーション をご覧ください。
wrongParam3001パラメーターの一部が正しくないことを示します(空白にできない箇所が空白になっている、型が間違っているなど)。
activateOnceError3005.activate メソッドを複数回呼び出すことはできません。
profileWasChanged3006操作中にユーザープロファイルが変更されました。
unsupportedData3007データ形式が SDK でサポートされていないことを示します。
persistingDataError3100データの保存中にエラーが発生しました。
fetchTimeoutError3101設定された制限時間内にペイウォールを取得できなかったことを示します。この状況を避けるには、ローカルフォールバックを設定 してください。
operationInterrupted9000この操作はシステムによって中断されました。