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
}
}
デバッグ前に詳細ログを有効にしてください。 ほとんどの AdaptyError は、StoreKit、ネットワーク、またはバックエンドのエラーをラップしています。詳細ログを有効にすると(Adapty.logLevel = .verbose — ロギングを参照)、ラップされたエラーがコンソールに出力されるため、実際の原因を特定しやすくなります。originalError プロパティはログレベルに関係なく設定されますが、詳細ログを使うとコンソールで確認できます。
これらの解決策で問題が解消されない場合は、サポートへのお問い合わせ前にその他の問題を参照して、より効率的にサポートを受けるための手順をご確認ください。
StoreKitエラー
| エラー | コード | 解決策 |
|---|---|---|
| unknown | 0 | 不明または予期しないエラーが発生したことを示すエラーコードです。 再試行するか、その他の問題セクションをご覧ください。 |
| clientInvalid | 1 | クライアントが実行しようとしたアクションを許可されていないことを示すエラーコードです。 |
| paymentCancelled | 2 | ユーザーが支払いリクエストをキャンセルしたことを示すエラーコードです。 対応は不要ですが、ビジネスロジックの観点から、ユーザーに割引を提案したり、後日リマインドしたりすることができます。 |
| paymentInvalid | 3 | 支払いパラメーターの1つがApp Storeに認識されなかったことを示すエラーです。 |
| paymentNotAllowed | 4 | ユーザーが支払いの承認を許可されていないことを示すエラーコードです。 |
| storeProductNotAvailable | 5 | リクエストされたプロダクトがストアで利用できないことを示すエラーコードです。 アプリを再インストールしてみてください。 |
| cloudServicePermissionDenied | 6 | ユーザーがCloudサービス情報へのアクセスを許可していないことを示すエラーコードです。 |
| cloudServiceNetworkConnectionFailed | 7 | デバイスがネットワークに接続できなかったことを示すエラーコードです。 |
| cloudServiceRevoked | 8 | ユーザーがこのクラウドサービスの使用許可を取り消したことを示すエラーコードです。 |
| privacyAcknowledgementRequired | 9 | ユーザーがAppleのプライバシーポリシーをまだ承認していないことを示すエラーコードです。 |
| unauthorizedRequestData | 10 | アプリが必要な権限を持っていないプロパティを使用しようとしていることを示すエラーコードです。 |
| invalidOfferIdentifier | 11 | オファーの App Store Connectで必要なオファーを設定し、有効なオファーidentifierを渡していることを確認してください。 |
| invalidSignature | 12 | 支払い割引の署名が無効であることを示すエラーコードです。 |
| missingOfferParams | 13 | 支払い割引のパラメーターが不足していることを示すエラーコードです。 |
| invalidOfferPrice | 14 | App Store Connectで指定した価格が無効になったことを示すエラーコードです。オファーは常に割引価格である必要があります。 |
| noProductIDsFound | 1000 | ペイウォールでリクエストしたプロダクトが、App Storeに登録されているにもかかわらず購入できない状態であることを示すエラーです。 このエラーが発生している場合は、コード1000 |
| productRequestFailed | 1002 | 現時点で利用可能なプロダクトを取得できません。 |
| cantMakePayments | 1003 | このデバイスではアプリ内課金が許可されていません。トラブルシューティングガイドを参照してください。 |
| cantReadReceipt | 1005 | デバイスに有効なレシートがありません。これはサンドボックステスト中に発生することがあります。 サンドボックスでは、実際に購入を行うまで有効なレシートファイルが存在しないため、アクセス前に購入を済ませてください。サンドボックステスト中は、有効なAppleサンドボックスアカウントでデバイスにサインインしていることも確認してください。 |
| productPurchaseFailed | 1006 | プロダクトの購入に失敗しました。これは基底のStoreKitエラーをラップしています。実際の原因を確認するにはoriginalErrorを参照するか、詳細ログを有効にしてコンソールで確認してください。ラップされたエラーは通常、上の表のStoreKitコード0〜14のいずれかで、最もよく見られるのはpaymentCancelled、paymentInvalid、paymentNotAllowed、invalidOfferPriceです。特定の原因を特定できない場合は、新しいサンドボックスプロファイルを試してください。それでも失敗する場合はAppleサポートにお問い合わせください。 |
| refreshReceiptFailed | 1010 | レシートの更新操作に失敗しました。 |
| fetchSubscriptionStatusFailed | 1020 | App Storeからサブスクリプションのステータスの取得に失敗しました。 |
| unknownTransactionId | 1030 | トランザクションIDが不明です。 |
| paymentPendingError | 1050 | 支払いは現在保留中です。 |
ネットワークエラー
| Error | Code | Solution |
|---|---|---|
| notActivated | 2002 | Adapty SDKが有効化されていません。 スプラッシュ画面や初期UIフックが Adapty.activate の完了前にAdaptyのメソッドを呼び出す場合によく見られます。実機とシミュレーターではタイミングが異なるため、再現しないことがあります。他のSDK呼び出しをスケジュールする前に、activate の完了ハンドラーまたは非同期結果を待機してください。詳細は iOS SDKの呼び出し順序 を参照してください。 |
| badRequest | 2003 | リクエストが不正です。getPaywall 実行時は、リクエストしたプレースメントがAPIキーに紐付いたアプリに存在しないことが最もよくある原因です。プレースメントIDが正確にコピーされているか、またAPIキーとプレースメントがAdapty ダッシュボード上の同じアプリから取得したものかを確認してください。 |
| serverError | 2004 | サーバーエラーです。 しばらくしてから再試行してください。問題が解消しない場合は、Adaptyサポートチームにお問い合わせください。 このコードはスロットリングにも対応しています。同じエンドポイントを頻繁に呼び出した場合(例:プロファイルの頻繁な更新など)、サーバーは429を返し、SDKはリトライ間隔が経過するまでそのエンドポイントをブロックします。 |
| networkFailed | 2005 | ユーザーのデバイスのネットワーク接続に問題があることを示すエラーです。 VPNを無効にするか、モバイルデータ通信からWiFiへ(またはその逆へ)切り替えてみてください。 |
| decodingFailed | 2006 | レスポンスのデコードに失敗したことを示すエラーです。SDKが解析できないデータを受信しました。 SDKがローカルのフォールバックファイルを読み込む際に発生する場合、そのファイルはSDKが期待するバージョンより古い可能性があります。Placements ページから最新のファイルをダウンロードしてください。フォールバックのバージョン不一致はエラー3001としても現れることがあります。 |
| encodingFailed | 2009 | リクエストのエンコードに失敗したことを示すエラーです。 |
一般エラー
| エラー | コード | 解決策 |
|---|---|---|
| analyticsDisabled | 3000 | 無効化されているため、アナリティクスイベントを処理できません。 |
| wrongParam | 3001 | パラメーターが正しくないことを示すエラーです。 Adaptyのペイウォールビルダーを使用していてこのエラーでペイウォールを表示できない場合は、ペイウォールビルダーでShow on deviceをオンにしてください。 もう一つの原因として、ローカルのフォールバックファイルのバージョンがSDKバージョンと一致していない可能性があります。ダッシュボードで新しいファイルをダウンロードしてください。 |
| activateOnceError | 3005 | .activateメソッドを複数回呼び出すことはできません。 |
| profileWasChanged | 3006 | 操作中にユーザープロファイルが変更されました。Adapty.identifyが実行中にメソッドが呼び出された場合に発生します。実行中の呼び出しが切り替わる直前のプロファイルに届き、SDKがそれを拒否します。ユーザーアクションの呼び出しの前に必ずidentifyをawaitする(または完了ハンドラーを使用する)ようにしてください。詳細はiOS SDKの呼び出し順序を参照してください。 |
| unsupportedData | 3007 | データフォーマットがSDKでサポートされていないことを示すエラーです。 |
| unidentifiedUserLogout | 3020 | 未識別ユーザーに対してlogoutメソッドを呼び出すことはできません。 |
| fetchTimeoutError | 3101 | フェッチ操作がタイムアウトしたことを示すエラーです。 |
| operationInterrupted | 9000 | この操作はシステムによって中断されました。 |
その他の問題
まだ解決策が見つからない場合は、次のステップをお試しください。
- SDKを最新バージョンにアップグレードする: 最新のSDKバージョンはより安定しており、既知の問題の修正が含まれているため、常に最新版へのアップグレードをお勧めします。
- サポートチームに連絡するか、サポートフォーラムで他の開発者に相談する
- support@adapty.ioまたはチャットからサポートチームに連絡する: SDKのアップグレードができない場合や、アップグレードしても解決しない場合は、サポートチームにお問い合わせください。詳細ログを有効にしてログをチームと共有することで、問題の解決が早まります。関連するコードスニペットも添付できます。