SDK デバッグメッセージ
0:05:00SDK のデバッグメッセージを理解することは、問題解決においてとても重要です。このステップでは、ロギングを有効にする方法と、よく見られるログメッセージの解釈方法を説明します。
デバッグロギングを有効にする
SDK が何をしているのかを確認できるように、開発中は常に詳細なロギングを有効にしてください。
iOS (Swift)
swift
import RevenueCat
// configure の前に有効化
Purchases.logLevel = .debug // 最も詳細なレベル
// Purchases.logLevel = .verbose // 代替
Purchases.configure(withAPIKey: "appl_xxx")Android (Kotlin)
kotlin
import com.revenuecat.purchases.LogLevel
// configure の前に有効化
Purchases.logLevel = LogLevel.DEBUG // 最も詳細なレベル
// Purchases.logLevel = LogLevel.VERBOSE // 代替
val builder = PurchasesConfiguration.Builder(this, "goog_xxx")
Purchases.configure(builder.build())Log Level
- DEBUG: 最も詳細なレベルで、すべての内容を表示します(開発中に使用)。
- VERBOSE: 動作に関する詳細な情報を表示します。
- INFO: 一般的な情報メッセージです。
- WARN: 潜在的な問題に関する警告です。
- ERROR: エラーメッセージのみを表示します。
プロダクション: プロダクションでは、パフォーマンスのオーバーヘッドとログの煩雑さを避けるため、log level を
.warn または .error に設定してください。
よく見られる警告メッセージ
警告:商品が承認されていない(iOS)
text
[RevenueCat] Warning: RevenueCat SDK is configured correctly, but contains some issues you might want to address
Warnings:
• Your products are configured in RevenueCat but aren't approved in App Store Connect yet.
This prevents users from making purchases in production.
Please ensure all products are approved and available for sale in App Store Connect.意味:
- RevenueCat ダッシュボードには商品が存在します。
- しかし、App Store Connect ではまだ承認されていません。
- 開発中であれば正常な状態です。
必要な対応:
- テスト中であれば、StoreKit Configuration File を使用するか、承認を待ってください。
- プロダクションであれば、アプリと一緒に商品を審査に提出してください。
- ローカル開発中は無視しても問題ありません。
警告:オファリング構成の問題
text
[RevenueCat] Warning: The offerings 'default' have configuration issues that may prevent users from
seeing product options or making purchases.
Product Issues:
• Package 'monthly' references product 'premium_monthly' which is not available
• Package 'annual' references product 'premium_annual' which is not available意味:
- オファリングのパッケージが、見つからない商品を参照しています。
- 商品がストアに存在しないか、ID が一致していない可能性があります。
必要な対応:
- RevenueCat とストアの間で商品 ID が一致しているか確認してください。
- 商品がストアでアクティブ/承認済みの状態か確認してください。
- 商品が StoreKit Configuration に追加されているか確認してください(iOS)。
よく見られるエラーメッセージ
エラー:商品を 1 つも取得できない
text
[RevenueCat] Error fetching offerings - The operation couldn't be completed.
(RevenueCat.OfferingsManager.Error error 1.)
There's a problem with your configuration. None of the products registered in the RevenueCat dashboard
could be fetched from App Store Connect (or the StoreKit Configuration file if one is being used).
More information: https://rev.cat/why-are-offerings-empty意味:
- SDK がストアから商品を取得しようとしましたが、すべて失敗しました。
- 致命的な構成の問題です。
必要な対応:
- 商品 ID が正確に一致しているか確認してください。
- バンドル ID およびパッケージ名が一致しているか確認してください。
- iOS の場合は StoreKit Configuration を使用するか、商品の承認を待ってください。
- Android の場合はサービスアカウントの権限を確認してください。
詳しいトラブルシューティング方法は、前述のオファリング取得エラーのステップを参照してください。
エラー:ネットワーク/API の問題
text
[RevenueCat] Error: Unable to fetch offerings
NetworkError: The Internet connection appears to be offline
URLError: The request timed out意味:
- デバイスにネットワーク接続がありません。
- または、RevenueCat サーバーに接続できません。
必要な対応:
- デバイスのインターネット接続を確認してください。
- 他のアプリやウェブサイトが動作するかテストしてください。
- VPN を使用している場合は無効にしてください。
- アプリにリトライロジックを実装してください。
エラー:無効な API キー
text
[RevenueCat] Error: Invalid API key
The API key provided is invalid or doesn't have access to this app意味:
- API キーが間違っているか、タイプミスがあります。
- プラットフォームに合わないキーを使用しています(Android に iOS のキーを使用している、またはその逆)。
必要な対応:
- RevenueCat ダッシュボードの API keys に移動してください。
- プラットフォームに合った正しいキーをコピーしてください。
- iOS:
appl_で始まります。 - Android:
goog_で始まります。
- iOS:
- コードを更新してください。
ストアのエラーコードを理解する
iOS StoreKit エラーコード
| コード | 名前 | 意味 |
|---|---|---|
| 0 | unknown | 不明または予期しないエラー |
| 1 | clientInvalid | クライアントがリクエストを送信できない |
| 2 | paymentCancelled | ユーザーが購入をキャンセルした |
| 3 | paymentInvalid | 購入識別子が無効 |
| 4 | paymentNotAllowed | デバイスで支払いが許可されていない |
| 5 | storeProductNotAvailable | ストアで商品が利用できない |
Android Billing レスポンスコード
| コード | 名前 | 意味 |
|---|---|---|
| 0 | OK | 成功 |
| 1 | USER_CANCELED | ユーザーが購入をキャンセルした |
| 2 | SERVICE_UNAVAILABLE | ネットワーク接続が切断された |
| 3 | BILLING_UNAVAILABLE | Billing API のバージョンがサポートされていない |
| 4 | ITEM_UNAVAILABLE | 購入可能な商品ではない |
| 5 | DEVELOPER_ERROR | API に無効な引数が渡された |
| 6 | ERROR | API の動作中に致命的なエラーが発生 |
| 7 | ITEM_ALREADY_OWNED | ユーザーがすでにこの商品を所有している |
| 8 | ITEM_NOT_OWNED | ユーザーが商品を所有していない(復元) |
購入フローのログを解釈する
成功した購入フローがログでどのように表示されるかを見てみましょう。
text
[RevenueCat] DEBUG: Fetching offerings from cache
[RevenueCat] DEBUG: Offerings retrieved successfully
[RevenueCat] DEBUG: makePurchase called for package: monthly
[RevenueCat] DEBUG: Starting purchase flow for product: premium_monthly
[RevenueCat] DEBUG: Purchase initiated
[RevenueCat] DEBUG: Finishing purchase transaction
[RevenueCat] DEBUG: Transaction finished successfully
[RevenueCat] INFO: Purchase completed successfully
[RevenueCat] DEBUG: CustomerInfo updatedポイント:
- 購入のライフサイクル全体を示しています。
- トランザクションが自動的に完了します。
- 購入後に
CustomerInfoが更新されます。
よく見られる SDK メッセージのクイックリファレンス
| ログメッセージ | 意味 | 必要な対応 |
|---|---|---|
| "Products not approved in App Store" | RevenueCat はダッシュボードで商品を見つけましたが、まだ Apple の承認を受けていません。 | 開発中であれば正常な状態です。ローカルテストには StoreKit Configuration File を使用するか、アプリのバイナリと一緒に商品を審査に提出してください。開発中は無視しても問題ありません。 |
| "Offering configuration issue" | パッケージが、ストアで見つからない商品を参照しています。 | RevenueCat とストアの間で商品 ID が一致しているか確認してください。商品がアクティブ(Android)または承認済み(iOS)の状態か確認してください。オファリングから、すでに有効でない商品参照を削除してください。 |
| "None of the products registered" | すべての商品をストアから読み込めませんでした。致命的な構成エラーです。 | 商品 ID、バンドル ID およびパッケージ名、API キー、ストアアカウントの状態を確認してください。詳細な情報を確認するには logLevel = .debug を有効にしてください。最も頻繁に発生する連携エラーです。 |
| "Error performing request" | RevenueCat API へのネットワークリクエストが失敗しました。 | インターネット接続を確認してください。VPN やプロキシを一時的に無効にしてください。api.revenuecat.com に接続できるか確認してください。一時的な失敗の場合は、SDK が指数バックオフ方式で自動的にリトライします。 |
| "Invalid API Key" | Purchases.configure() に渡された API キーが無効か、プラットフォームに合っていません。 |
RevenueCat ダッシュボードの API keys に移動してください。正しいキーをコピーしてください。iOS は appl_、Android は goog_ です。コピーの際に不要な空白や文字が追加されていないか確認してください。 |
| "There is already a configure call" | アプリのライフサイクル内で SDK が複数回構成されています。 | Purchases.configure() は一度だけ呼び出してください。通常は AppDelegate(iOS)または Application.onCreate()(Android)で呼び出します。異なるアプリのエントリーポイント(例:SceneDelegate、SwiftUI App init)で重複した呼び出しがないか確認してください。 |
| "Finishing transaction" | 正常な SDK の動作です。SDK がストアのトランザクションを完了しています。 | 特に対応は必要ありません。購入が成功した後に表示される正常なメッセージです。対応する購入がないのにこのメッセージが表示される場合は、以前に完了しなかったトランザクションを処理している可能性があります。 |
| "CustomerInfo updated" | ユーザーのエンタイトルメント状態が変更されました。 | 特に対応は必要ありません。購入、復元、サブスクリプション変更の後に表示される正常なメッセージです。UI を更新するには、CustomerInfo リスナーでこの更新を受け取る必要があります。 |
| SKError Code 0 (unknown) | iOS で StoreKit が不明なエラーを返しました。 | 多くの場合は一時的な問題です。操作を再試行してください。続く場合は Apple の System Status を確認してください。デバイスでサンドボックスアカウントからログアウトし、再度ログインしてみてください。 |
| SKError Code 2 (paymentCancelled) | ユーザーが購入ダイアログをキャンセルしました。 | 特に対応は必要ありません。エラーメッセージを表示しないよう、アプリで自然に処理してください。ユーザーが購入を進めないことを選択しただけです。 |
| BillingResponseCode 1 (USER_CANCELED) | ユーザーが Google Play の購入ダイアログを閉じました。 | 特に対応は必要ありません。iOS のキャンセルと同様です。自然に処理し、ユーザーが準備できたときに再試行できるようにしてください。 |
| BillingResponseCode 3 (BILLING_UNAVAILABLE) | デバイスで Google Play Billing が利用できません。 | デバイスに Google Play ストアがインストールされており、最新の状態か確認してください。デバイスに Google アカウントがログインしているか確認してください。エミュレーターは「Google APIs」ではなく「Google Play」のシステムイメージを使用する必要があります。 |
| BillingResponseCode 5 (DEVELOPER_ERROR) | 無効な引数が渡されたか、Google Play でアプリが正しく構成されていません。 | パッケージ名が一致しているか、アプリがテストトラックに公開されているか、商品 ID が存在するかを確認してください。通常、Google Play Console の構成がアプリのビルドと一致していない場合に発生します。 |
| "Purchases not completed" | 購入が開始されましたが、完了しませんでした。 | 購入中はアプリがフォアグラウンドに留まるようにしてください。Android では `Activity` が再生成されていないか確認してください。iOS では購入コールバックが UI スレッドの処理にブロックされていないか確認してください。 |
| ConfigurationError Code 23 | 一般的な構成エラーのラッパーです。実際の原因は下位のエラーに含まれています。 | 下位のエラーを確認するには、エラーオブジェクト全体をログに出力してください(JSON.stringify(e) または userInfo を確認)。商品 ID の不一致、Google Play での後方互換性の欠如、未署名の契約がよくある原因です。コミュニティの議論を参照してください。 |
| "BillingClient is not connected yet" | BillingClient の接続が完了する前に、SDK が Play ストアにクエリを送信しました。 | SDK が再接続を自動的に処理します。デバイスで Google Play 開発者サービスが最新の状態か確認してください。configure() の直後にオファリングを取得しないでください。接続処理が改善された最新の SDK バージョンに更新してください。コミュニティの議論を参照してください。 |
| ログイン/ログアウト後にエンタイトルメントが失われる | 購入が匿名 ID に紐付けられており、logIn() の後に引き継がれませんでした。 |
認証直後、どの購入よりも先にユーザー ID で Purchases.logIn() を呼び出してください。認証状態が変わった後には syncPurchases() を実装してください。フォールバックとしてユーザーに「Restore Purchases」を案内してください。コミュニティの議論を参照してください。 |
付与したエンタイトルメントが getCustomerInfo() に表示されない |
サーバー側でエンタイトルメントを付与した後、SDK のキャッシュが更新されていません。 | 新しく取得させるには、getCustomerInfo() の前に Purchases.shared.invalidateCustomerInfoCache() を呼び出してください。SDK は顧客情報を 5 分間キャッシュします。サーバー側の変更(例:プロモーション付与)にはキャッシュのクリアが必要です。コミュニティの議論を参照してください。 |
効果的なデバッグのためのヒント
- 問題を解決するときは、必ずデバッグロギングを有効にすることから始めてください。
- SDK のメッセージだけを絞り込むには、ログで「RevenueCat」を検索してください。
- エラーと警告をすばやく見つけるには、エラーおよび警告の記号を確認してください。
- 各操作(オファリングの取得、購入、復元)の直後にログを確認してください。
- サポートに問い合わせるときは、エラーメッセージ全体をコピーしてください。
- パフォーマンスの問題を避けるため、プロダクションでは無効にしてください。