一般的なデバッグのヒント
0:04:00特定のエラーメッセージへの対処だけでなく、次のような一般的なデバッグ手法を活用すると、問題をより早く診断して解決できます。
1. RevenueCat ダッシュボードを活用する
ダッシュボードは最初に使うべきデバッグツールです。設定とユーザーアクティビティに関するリアルタイムデータを表示します。
顧客履歴
- RevenueCat ダッシュボードに移動します。
- Customer listsに移動します。
- 次の項目でユーザーを検索します。
- App User ID。
- メールアドレス(設定している場合)。
- トランザクション ID。
- 該当ユーザーの購入履歴全体、アクティブなエンタイトルメント、サブスクリプションの状態を確認します。
これにより、次のことを確認できます。
- 購入は実際に処理されたか。
- ユーザーはどのエンタイトルメントを保有しているか。
- サブスクリプションはいつ期限切れになったか。
- 失敗したトランザクションはあるか。
設定の検証
ダッシュボードは設定の問題に関する警告を表示します。
- サービス認証情報の不足。
- ストアで商品が見つからない。
- パッケージのないオファリング。
- 公開されていないペイウォール。
2. サンドボックスと本番環境の両方でテストする
環境固有の問題を見つけるには、常に両方の環境でテストする必要があります。
サンドボックステスト(iOS)
メリット
- 実際の請求が発生しません。
- サブスクリプションの更新がより速くなります(5分 = 1か月)。
- サブスクリプションのライフサイクルを手軽にテストできます。
デメリット
- サンドボックスアカウントの設定が必要です。
- ときどき不安定になったり遅くなったりします。
- 本番環境と動作が異なります。
本番環境テスト
iOS の場合: サンドボックスアカウントで TestFlight を使用するか、別の「テスト用」ビルドを作成します
Android の場合: ライセンステスターとともに内部テストトラックを使用します
本番環境でテストすべきタイミング
- 主要なリリースの前。
- 設定を大きく変更した後。
- エンドツーエンドのフロー全体を検証するとき。
3. より速いテストのために Test Store を使う
RevenueCat Test Store は、サンドボックスで遭遇する多くの悩みを解消してくれます。
- 実際のストアへの依存なし: App Store Connect や Google Play がなくても動作します。
- 予測可能な結果: 購入の成功/失敗を直接制御できます。
- シミュレーター/エミュレーターで動作: 実機が不要です。
- CI/CD フレンドリー: 自動テストに最適です。
詳しくは以下を参照してください。
4. 異常な動作が発生したらキャッシュをクリアする
キャッシュされたデータが奇妙な動作を引き起こすことがあります。
RevenueCat の顧客情報キャッシュをクリアする
iOS:
swift
// SDK に最新データの取得を強制する
Purchases.shared.invalidateCustomerInfoCache()Android:
kotlin
// SDK に最新データの取得を強制する
Purchases.sharedInstance.invalidateCustomerInfoCache()デバイス/アプリのキャッシュをクリアする
iOS:
- アプリを削除します。
- デバイスを再起動します。
- アプリを再インストールします。
Android:
- 設定 → アプリに移動します。
- 対象のアプリを見つけます。
- ストレージ → キャッシュを削除をタップします。
- Google Play ストアのキャッシュも一緒にクリアします。
5. RevenueCat コミュニティを確認する
同じ問題をすでに経験した人がいる可能性が高いです。
- RevenueCat コミュニティフォーラム: 発生したエラーを検索してみます。
- RevenueCat ドキュメント: 公式ドキュメントとガイドです。
- GitHub リポジトリ: Issue や PR を確認します。
6. プロキシを活用したネットワークデバッグ
Charles Proxy などのツールでネットワークトラフィックを検査できます。
確認すべき項目
- api.revenuecat.com への API リクエスト。
- HTTP ステータスコード(200 = 成功、401 = 認証の問題など)。
- リクエスト/レスポンスのペイロード。
- リクエストの所要時間(遅いリクエストはネットワークの問題を示唆します)。
Charles Proxy をセットアップする
- Charles Proxy をダウンロードします。
- デバイスが Charles をプロキシとして使用するように設定します。
- デバイスに Charles の証明書をインストールします。
- アプリを実行してリクエストを確認します。
注: ネットワーク検査は高度な手法であり、通常は複雑な問題にのみ必要です。まずは SDK のログから確認してください。
7. 問題の範囲を絞り込む
デバッグの際は、何が問題を引き起こしているのか範囲を絞り込んでみてください。
最小限のテストケースを作成する
swift
// SDK の初期化のみをテスト
Purchases.logLevel = .debug
Purchases.configure(withAPIKey: "appl_xxx")
print("SDK initialized")
// オファリングの取得のみをテスト
Task {
do {
let offerings = try await Purchases.shared.offerings()
print("Offerings fetched: \(offerings.all.count)")
} catch {
print("Error: \(error)")
}
}これにより、問題が次のどこにあるかを判断できます。
- SDK の初期化。
- ネットワーク/API アクセス。
- 商品の設定。
- アプリの UI/ロジック。
8. サンプルアプリと比較する
RevenueCat は、正常動作が確認された公式サンプルアプリを提供しています。
サンプルアプリをクローンしたら、以下の手順を進めてください。
- API キーを自分のものに置き換えます。
- 自分の設定でも正常に動作するかを確認します。
- 自分の実装をサンプルコードと比較します。
よくあるデバッグシナリオのクイックリファレンス
| シナリオ | 有力な根本原因 | 推奨アプローチ |
|---|---|---|
| サンドボックスではすべて動作するが本番環境では動作しない | 商品または契約が本番向けに完了していません。 | すべての商品が承認済み(iOS)またはアクティブ(Android)であることを確認します。有料アプリケーション契約がアクティブであることを点検します。正しい(サンドボックスではない)API キーを使用しているか確認します。RevenueCat ダッシュボードで設定の警告を確認します。 |
| 購入が一度は動作するが再インストール後に失敗する | インストール間で App User ID が変わり、新しい匿名ユーザーが作成されています。 | 安定したユーザー ID(例: 認証システムが発行した ID)とともに Purchases.logIn() を使用し、インストール間でアイデンティティを維持します。または、再インストール後に restorePurchases() を呼び出してストアアカウントを紐付けます。 |
| ダッシュボードではエンタイトルメントが付与されているが SDK では非アクティブと表示される | SDK のキャッシュがまだ最新のサーバーデータに更新されていません。 | Purchases.shared.invalidateCustomerInfoCache() を呼び出してから顧客情報を再取得します。SDK は顧客情報を5分間キャッシュします。新しく付与されたエンタイトルメントの場合はキャッシュのクリアが必要です。コミュニティでの議論を参考にしてください。 |
| ユーザーにアクティブなサブスクリプションはあるがエンタイトルメントがない | RevenueCat で商品がエンタイトルメントに紐付けられていません。 | RevenueCat ダッシュボード → Product Catalog → Entitlements で、商品が正しいエンタイトルメントに紐付けられているか確認します。各商品は明示的に紐付ける必要があります。トランザクションの詳細はダッシュボードの顧客ページで確認します。 |
| 同一人物に複数のユーザーアカウントが作成される | ログイン前に匿名 ID が作成されたか、異なる App User ID が使用されています。 | アプリのライフサイクルのできるだけ早い時点で Purchases.logIn() を使用します。RevenueCat は匿名ユーザーと識別済みユーザーの間で購入を移行できます。ユーザー識別のドキュメントを確認してください。 |
| Android で購入の復元が動作しない | 購入者とは別の Google アカウントでアプリがインストールされています。 | ユーザーは元の購入を行った Google アカウントでログインする必要があります。デバイスに複数のアカウントがある場合、デフォルトのアカウント(アプリのインストールに使用したアカウント)が購入者である必要があります。コミュニティでの議論を参考にしてください。 |
| ローカルでは動作するが CI/CD では失敗する | CI 環境にストアの設定やネットワークアクセスがありません。 | CI/CD パイプラインには RevenueCat Test Store を使用します。Test Store は実際のストアの認証情報が不要で、エミュレーターで動作し、予測可能な結果を提供します。Test Store コードラボを参考にしてください。 |
| Webhook イベントが届かない | サーバー通知 URL が設定されていないか、到達できません。 | RevenueCat ダッシュボード → Integrations → Webhooks で URL が正しいか、サーバーが外部からアクセス可能かを確認します。受信リクエストがあるかサーバーログを点検します。まずは webhook.site のようなツールでテストしてみます。 |
| ダッシュボードに売上が $0 と表示される | すべての購入がサンドボックス/テスト環境で発生しています。 | サンドボックスの購入は実際の売上を発生させません。ダッシュボードは環境ごとにフィルタリングします。テスト購入データを見るには、ダッシュボードの表示を「Sandbox」に切り替えます。本番の売上は、実際のストアでの購入が発生した後にのみ表示されます。 |
| Purchases.configure() の呼び出し時にアプリがクラッシュする | 誤ったスレッドで SDK を初期化したか、configure を重複して呼び出しています。 | Purchases.configure() はメインスレッドで一度だけ呼び出します。iOS では AppDelegate.application(_:didFinishLaunchingWithOptions:) を使用します。Android では Application.onCreate() を使用します。バックグラウンドスレッドでは絶対に設定しないでください。 |
| アカウント間の所有権の移行 | ユーザーがサブスクリプションを別のアカウントに移そうとしています。 | RevenueCat は移行動作の設定をサポートしています。ダッシュボード → Project Settings → General で Transfer Behavior を設定し、ユーザーアカウント間で購入がどのように移行されるかを制御します。移行動作のドキュメントを参考にしてください。 |
| プラットフォームごとにオファリングの表示が異なる | パッケージに紐付けられた商品がプラットフォームごとに異なります。 | オファリングの各パッケージは、iOS と Android の商品を別々に持つことができます。オファリングエディタで、各パッケージに両プラットフォームの商品が紐付けられているかを確認します。iOS の商品しかないパッケージは、Android では空として表示されます。 |
| 「Invalid Play Store credentials」エラーが72時間経過しても続く | 初回設定の後にサービスアカウントの権限が変更されたか、不完全です。 | Play Console → Users and Permissions で、サービスアカウントに Financial Data、Manage Orders、Monetization の権限があるかを再確認します。JSON 認証情報ファイルを再ダウンロードしてアップロードします。完全な詳細を確認するには、エラーオブジェクト全体をログ出力します。コミュニティでの議論を参考にしてください。 |
| ダッシュボードに「Credentials need attention」が表示される | Google が認証情報を反映するまでに最大36時間かかります。 | 認証情報を作成した後、最低36〜48時間待ちます。Google Cloud Console の IAM & Admin にサービスアカウントのメールアドレスが表示されるかを確認します。反映が進んでいる間は、繰り返し再アップロードしないでください。コミュニティでの議論を参考にしてください。 |
| ダッシュボードで「Credentials validation」エラーが発生する | Shared Secret、IAP Key、または JSON 認証情報ファイルが無効です。 | App Store の場合: Shared Secret を再生成するか、IAP Key を再ダウンロードします。App Store Connect で Key ID と Issuer ID を再確認します。Play Store の場合: サービスアカウントの JSON キーファイルを再生成します。コミュニティでの議論を参考にしてください。 |
デバッグチェックリスト
サポートを依頼する前に、次のステップをすべて完了しているか確認してください。
- デバッグログを有効にしたか(
Purchases.logLevel = .debug)。 - RevenueCat ダッシュボードで設定の警告を確認したか。
- ダッシュボードで顧客を確認したか(該当する場合)。
- ストアと RevenueCat の間で商品 ID が一致しているか確認したか。
- プラットフォームに合った正しい API キーであるか確認したか。
- サンドボックスと本番環境の両方でテストしたか(可能な場合)。
- キャッシュをクリアしてアプリを再起動したか。
- コミュニティフォーラムで類似の問題を検索したか。
- 問題を切り分けるために最小限のテストケースを作成したか。
- 公式ドキュメントを確認したか。