iOS SDKのエラー処理

Adapty SDKは、すべての種類のエラーを扱う独自のラッパー AdaptyError を持っています。基本的に、SDKから返されるすべてのエラーは AdaptyError です。originalError と adaptyErrorCode という2つの便利なプロパティがあり、以下で説明します。

originalError には、必要に応じて参照できる元のエラーが格納されています。SKError、NSError、または一般的な Swift の Error のいずれかです。このプロパティはオプションです。SDK が直接生成するエラー(データの不整合や欠落など)の場合、ラッパーの元となった元のエラーが存在しないことがあるためです。

adaptyErrorCode は、次のような一般的な問題の処理に使用できます。

  • 無効な資格情報
  • ネットワークエラー
  • 支払いのキャンセル
  • 請求の問題
  • 無効なレシート
  • その他多数

エラーコードを確認して適切に対応するのは非常に簡単です。

do {
    let info = try await Adapty.makePurchase(product: product)
} catch {
    if error.adaptyErrorCode == .paymentCancelled {
        // purchase was cancelled
        // you can offer discount to your user or remind them later
    }
}
Tip

デバッグ前に詳細ログを有効にしてください。 ほとんどの AdaptyError は、StoreKit、ネットワーク、またはバックエンドのエラーをラップしています。詳細ログを有効にすると(Adapty.logLevel = .verbose — ロギングを参照)、ラップされたエラーがコンソールに出力されるため、実際の原因を特定しやすくなります。originalError プロパティはログレベルに関係なく設定されますが、詳細ログを使うとコンソールで確認できます。

Important

これらの解決策で問題が解消されない場合は、サポートへのお問い合わせ前にその他の問題を参照して、より効率的にサポートを受けるための手順をご確認ください。

StoreKitエラー

エラーコード解決策
unknown0不明または予期しないエラーが発生したことを示すエラーコードです。
再試行するか、その他の問題 セクションを参照してください。
clientInvalid1クライアントが試みた操作の実行を許可されていないことを示すエラーコードです。
paymentCancelled2

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

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

paymentInvalid3支払いパラメーターのいずれかが App Store に認識されなかったことを示すエラーです。
paymentNotAllowed4ユーザーが支払いの承認を許可されていないことを示すエラーコードです。
storeProductNotAvailable5リクエストされたプロダクトがストアで利用できないことを示すエラーコードです。
アプリを再インストールしてみてください。
cloudServicePermissionDenied6ユーザーがクラウドサービス情報へのアクセスを許可していないことを示すエラーコードです。
cloudServiceNetworkConnectionFailed7デバイスがネットワークに接続できなかったことを示すエラーコードです。
cloudServiceRevoked8ユーザーがこのクラウドサービスの使用許可を取り消したことを示すエラーコードです。
privacyAcknowledgementRequired9ユーザーがまだ Apple のプライバシーポリシーに同意していないことを示すエラーコードです。
unauthorizedRequestData10アプリが必要なエンタイトルメントを持たないプロパティを使用しようとしていることを示すエラーコードです。
invalidOfferIdentifier11

オファーの identifier が無効です。たとえば、App Store でその識別子のオファーが設定されていない、またはオファーが取り消されている場合などが考えられます。

AppStore Connect で必要なオファーを設定し、有効なオファー識別子を渡してください。

invalidSignature12支払い割引の署名が無効であることを示すエラーコードです。
missingOfferParams13支払い割引にパラメーターが不足していることを示すエラーコードです。
invalidOfferPrice14App Store Connect で指定した価格が無効になったことを示すエラーコードです。オファーは常に割引価格である必要があります。
noProductIDsFound1000

このエラーは、ペイウォールでリクエストしたプロダクトが App Store に登録されているにもかかわらず、いずれも購入可能な状態にないことを示します。このエラーには InvalidProductIdentifiers 警告が伴う場合があります。エラーなしに警告のみが表示される場合は無視してください。

このエラーが発生している場合は、コード 1000 noProductIDsFound エラーの修正方法 セクションの手順に従ってください。

productRequestFailed1002現時点で利用可能なプロダクトを取得できません。
cantMakePayments1003このデバイスではアプリ内課金が許可されていません。トラブルシューティング ガイド を参照してください。
cantReadReceipt1005

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

サンドボックスでは、実際に購入を行うまで有効なレシートファイルが存在しないため、アクセス前に必ず購入を行ってください。また、サンドボックステスト中はデバイスに有効な Apple サンドボックスアカウントでサインインしていることを確認してください。

productPurchaseFailed1006プロダクトの購入に失敗しました。このエラーは StoreKit の内部エラーをラップしており、実際の原因を確認するには originalError を参照するか、詳細ログを有効にしてコンソールで確認してください。ラップされたエラーは通常、上記の表にある StoreKit コード 0〜14 のいずれかで、最も多いのは paymentCancelled、paymentInvalid、paymentNotAllowed、invalidOfferPrice です。特定の原因が特定できない場合は、新しい サンドボックスプロファイル を試し、それでも失敗する場合は Apple サポートにお問い合わせください。
refreshReceiptFailed1010レシートの更新操作が失敗しました。
fetchSubscriptionStatusFailed1020App Store からサブスクリプションのステータスを取得できませんでした。
unknownTransactionId1030トランザクション識別子が不明です。
paymentPendingError1050支払いは現在保留中です。
billingPlanUnavailable1060このデバイスではプロダクトがリクエストされた請求プランを提供していません。12 ヶ月コミットメント プランには iOS 26.4 以降と Xcode 26.5 以降でビルドされたアプリが必要です。

ネットワークエラー

ErrorCodeSolution
notActivated2002Adapty SDKが有効化されていません。
スプラッシュ画面や初期UIフックが Adapty.activate の完了前にAdaptyのメソッドを呼び出す場合によく見られます。実機とシミュレーターではタイミングが異なるため、再現しないことがあります。他のSDK呼び出しをスケジュールする前に、activate の完了ハンドラーまたは非同期結果を待機してください。詳細は iOS SDKの呼び出し順序 を参照してください。
badRequest2003リクエストが不正です。
getPaywall 実行時は、リクエストしたプレースメントがAPIキーに紐付いたアプリに存在しないことが最もよくある原因です。プレースメントIDが正確にコピーされているか、またAPIキーとプレースメントがAdapty ダッシュボード上の同じアプリから取得したものかを確認してください。
serverError2004サーバーエラーです。
しばらくしてから再試行してください。問題が解消しない場合は、Adaptyサポートチームにお問い合わせください。
このコードはスロットリングにも対応しています。同じエンドポイントを頻繁に呼び出した場合(例:プロファイルの頻繁な更新など)、サーバーは429を返し、SDKはリトライ間隔が経過するまでそのエンドポイントをブロックします。
networkFailed2005ユーザーのデバイスのネットワーク接続に問題があることを示すエラーです。
VPNを無効にするか、モバイルデータ通信からWiFiへ(またはその逆へ)切り替えてみてください。
decodingFailed2006レスポンスのデコードに失敗したことを示すエラーです。SDKが解析できないデータを受信しました。
SDKがローカルのフォールバックファイルを読み込む際に発生する場合、そのファイルはSDKが期待するバージョンより古い可能性があります。Placements ページから最新のファイルをダウンロードしてください。フォールバックのバージョン不一致はエラー3001としても現れることがあります。
encodingFailed2009リクエストのエンコードに失敗したことを示すエラーです。

一般エラー

エラーコード解決策
analyticsDisabled3000オプトアウトしているため、アナリティクスイベントを処理できません。
wrongParam3001このエラーは、いくつかのパラメーターが正しくないことを示しています。
旧ペイウォールビルダーを使用していてこのエラーによりペイウォールを表示できない場合は、そのビルダーで Show on device をオンにしてください。
また、ローカルのフォールバックファイルのバージョンが SDK バージョンと一致していない可能性もあります。ダッシュボードから新しいファイルをダウンロードしてください。
activateOnceError3005.activate メソッドを複数回呼び出すことはできません。
profileWasChanged3006操作中にユーザープロファイルが変更されました。
これは、Adapty.identify の処理中に別のメソッドが呼び出された場合に発生します。実行中の呼び出しが入れ替わる直前のプロファイルに反映され、SDK がリジェクトします。ユーザーアクションの呼び出しの前に、必ず identify を await するか、コンプリーションハンドラーを使用してください。詳しくは iOS SDK の呼び出し順序を参照してください。
unsupportedData3007このエラーは、データ形式が SDK でサポートされていないことを示しています。
unidentifiedUserLogout3020未識別ユーザーに対して logout メソッドを呼び出すことはできません。
fetchTimeoutError3101このエラーは、フェッチ操作がタイムアウトしたことを示しています。
operationInProgress3201同種の別の操作がまだ実行中です。
前回の呼び出しがまだ App Store メッセージを表示中の場合に showStoreMessages から返されます。完了するまで待ってから再試行してください。
resolverFailure3202SDK が操作に必要なリソースを見つけられませんでした。
ウィンドウシーンを渡さず、フォアグラウンドでアクティブなシーンも存在しない場合に、UIKit の showStoreMessages メソッドから返されます。シーンを明示的に渡すか、アプリがフォアグラウンドにある状態でメソッドを再度呼び出してください。
operationInterrupted9000この操作はシステムによって中断されました。

updateProfile 直後のフェッチが遅くなる場合

updateProfile でカスタム属性を設定し、同じセッション内でプレースメントをフェッチすると、SDK がまだ反映されていない属性からセグメントハッシュを計算してしまうことがあります。セグメントハッシュが更新されると自動的にリトライするため、症状はエラーではなくフェッチの遅延として現れます。リトライでも不一致が解消されない場合のみフェッチが失敗しますが、これは属性の書き込みがまだ完了していないことを意味します。

リトライを避けるには、フェッチの前に updateProfile を await してください。詳しくはiOS SDK の呼び出し順序をご覧ください。

その他の問題

まだ解決策が見つからない場合は、次のステップをお試しください。

  • SDKを最新バージョンにアップグレードする: 最新のSDKバージョンはより安定しており、既知の問題の修正が含まれているため、常に最新版へのアップグレードをお勧めします。
  • サポートチームに連絡するか、サポートフォーラムで他の開発者に相談する
  • support@adapty.ioまたはチャットからサポートチームに連絡する: SDKのアップグレードができない場合や、アップグレードしても解決しない場合は、サポートチームにお問い合わせください。詳細ログを有効にしてログをチームと共有することで、問題の解決が早まります。関連するコードスニペットも添付できます。