オファリング取得エラー
0:08:00オファリング取得エラーは、開発者が最も頻繁に遭遇する問題のひとつです。主に、RevenueCatがアプリストアから商品情報を取得できないときに発生します。
問題 1: "None of the products could be fetched" エラー
エラーメッセージ
[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よくある原因
- 商品が未設定: RevenueCatダッシュボードに商品が設定されていません。
- Product IDの不一致: RevenueCat上のIDがストアの商品と一致していません。
- 現在のストアフロントで商品が利用不可: サポートされていない地域でテストしています。
- bundle ID / パッケージ名の不一致: アプリの識別子がダッシュボードと一致していません。
- 商品が未承認(iOS): App Store Connectで商品が審査待ちです。
- サービスアカウントの問題(Android): Google Playの認証情報が設定されていません。
解決手順
ステップ1: RevenueCatに商品が存在するか確認する
- RevenueCatダッシュボードに移動します。
- Product Catalog → Productsに移動します。
- 商品が一覧に表示されているか確認します。
- 空の場合は、商品をインポート(import)するか手動で作成します。
ステップ2: Product IDがストアと一致しているか確認する
iOSの場合
- App Store ConnectでProduct IDを確認します。
- RevenueCatダッシュボード(Product Catalog → Products)と比較します。
- 大文字・小文字まで正確に一致しているか確認します。
Androidの場合
- Google Play ConsoleでProduct IDを確認します。
- RevenueCatダッシュボードと比較します。
- 大文字・小文字まで正確に一致しているか確認します。
ステップ3: 商品がオファリングに含まれているか確認する
- RevenueCatダッシュボードでProduct Catalog → Offeringsに移動します。
- オファリングを選択します(通常は "default")。
- パッケージが存在し、商品を含んでいるか確認します。
- パッケージがない場合は、Editをクリックして商品を含むパッケージを追加します。
ステップ4: プラットフォーム別の設定を確認する
iOSの場合
- RevenueCatでbundle IDが一致しているか確認します(Apps & providers → App Store)。
- 商品が承認されているか確認するか、StoreKit Configuration Fileを使用します。
- サンドボックステスターでログインしているか確認します(サンドボックスでテストする場合)。
Androidの場合
- RevenueCatでパッケージ名が一致しているか確認します(Apps & providers → Google Play)。
- サービスアカウントが設定され、権限を持っているか確認します。
- Google Play Consoleで商品がActive状態か確認します。
- アプリが少なくともInternal Testingに公開されているか確認します。
問題 2: 空のオファリング
症状
offerings.allが空です。offerings.currentがnilです。- エラーメッセージはありませんが、offeringsオブジェクトにデータがありません。
よくある原因
- オファリングにパッケージがない: オファリングは存在しますが、パッケージがありません。
- デフォルトのオファリングが未設定: デフォルトに指定されたオファリングがありません。
- パッケージに商品が未連携: パッケージは存在しますが、商品がありません。
- オファリング識別子の不一致: コードが誤ったオファリング識別子をリクエストしています。
解決手順
ステップ1: オファリングにパッケージがあるか確認する
- RevenueCatダッシュボードでProduct Catalog → Offeringsに移動します。
- オファリングをクリックします(例: "default")。
- Packagesセクションにパッケージが少なくとも1つあるか確認します。
- 空の場合は、Editをクリックしてパッケージを追加します。
ステップ2: パッケージに商品があるか確認する
- オファリングの各パッケージを確認します。
- 使用するプラットフォーム(iOSまたはAndroid)に合った商品が連携されているか確認します。
- 各パッケージには、少なくとも1つのProduct IDが必要です。
ステップ3: デフォルトのオファリングを設定する
- Product Catalog → Offeringsに移動します。
- メインのオファリングを見つけます。
- "Current" バッジが表示されているか確認します。
- 表示されていない場合は、そのオファリングをクリックしてMake Currentを選択します。
ステップ4: コードが正しい識別子を使用しているか確認する
iOS
let offerings = try await Purchases.shared.offerings()
// 現在のオファリングが存在するか確認
if let offering = offerings.current {
print("Offering: \(offering.identifier)")
print("Packages: \(offering.availablePackages.count)")
} else {
print("No current offering set")
}Android
val offerings = Purchases.sharedInstance.awaitOfferings()
// 現在のオファリングが存在するか確認
offerings.current?.let { offering ->
Log.d("RC", "Offering: ${offering.identifier}")
Log.d("RC", "Packages: ${offering.availablePackages.size}")
} ?: Log.d("RC", "No current offering set")問題 3: オファリングの設定警告
エラーメッセージ
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よくある原因
- プラットフォーム別商品の欠落: パッケージにiOS商品はありますが、Android商品がありません(またはその逆)。
- 誤った商品の連携: パッケージに連携された商品がストアに存在しません。
- プラットフォームフィルターの問題: 商品は存在しますが、現在のプラットフォームではフィルタリングされて除外されています。
解決手順
ステップ1: パッケージ設定を確認する
- RevenueCatダッシュボードでオファリングに移動します。
- 各パッケージにiOSとAndroidの両方の商品があるか確認します(両プラットフォームをサポートする場合)。
- 片方のプラットフォームのみをサポートする場合は、そのプラットフォームの商品が存在するか確認します。
ステップ2: 商品がストアに存在するか確認する
- 警告から問題のProduct IDをコピーします。
- App Store ConnectまたはGoogle Play Consoleに存在するか確認します。
- 存在しない場合は、次のいずれかを行います。
- ストアに商品を作成する、
- またはRevenueCatで商品の参照を削除もしくは更新します。
問題 4: ネットワークおよびAPIエラー
エラーメッセージ
Error: Unable to fetch offerings
NetworkError: The Internet connection appears to be offline
Error: Request timed outよくある原因
- ネットワーク接続なし: デバイスにインターネット接続がありません。
- ファイアウォール/VPNによるブロック: 社内ネットワークやVPNがRevenueCatのサーバーをブロックしています。
- 不正なAPIキー: 誤ったAPIキーが設定されています。
- サーバーの問題: まれに発生するRevenueCatのサービス障害です。
解決手順
ステップ1: ネットワーク接続を確認する
- デバイスまたはシミュレーターでインターネット接続をテストします。
- ブラウザでWebサイトを開いてみます。
- Wi-Fiまたはモバイルデータ通信が有効になっているか確認します。
ステップ2: APIキーを確認する
// プラットフォームに合った正しいAPIキーを使用しているか確認
// iOS: "appl_" で始まる必要があります
// Android: "goog_" で始まる必要があります
Purchases.configure(withAPIKey: "appl_xxxxxxxxxxx")ステップ3: VPN/プロキシなしでテストする
- VPNまたはプロキシを一時的に無効にします。
- オファリングの取得が正常に動作するかテストします。
- 正常に動作する場合は、RevenueCatのドメインを許可するようにVPN/ファイアウォールを設定します。
ステップ4: リトライロジックを実装する
func fetchOfferingsWithRetry(maxRetries: Int = 3) async throws -> Offerings {
var lastError: Error?
for attempt in 1...maxRetries {
do {
return try await Purchases.shared.offerings()
} catch {
lastError = error
if attempt < maxRetries {
// リトライ前に待機(指数バックオフ)
try await Task.sleep(nanoseconds: UInt64(pow(2.0, Double(attempt))) * 1_000_000_000)
}
}
}
throw lastError ?? NSError(domain: "Offerings", code: -1)
}問題 5: SampleCatではオファリングが動作するのに自分のアプリでは動作しない
症状
RevenueCatのSampleCatアプリ(またはREST API)ではオファリングと商品を取得できるのに、bundle IDが同じであるにもかかわらず、自分で作ったアプリでは空のオファリングが返されたり、商品を取得できなかったりします。
発生する原因
同じbundle IDでSampleCatが正常に動作するなら、RevenueCatダッシュボードの設定とストアの商品は正しいことを意味します。問題は、アプリがSDKを初期化または通信する方法にあります。bundle ID、APIキー、ストアが完全なチェーンを構成する必要があります。
Store (App Store / Google Play)
↕ (Product IDが一致する必要があります)
RevenueCat Project (ここでbundle IDを設定)
↕ (APIキー + bundle IDが一致する必要があります)
Your App (Xcode/Gradleのbundle ID + コードのAPIキー)3つの層がすべて揃っている必要があります。SampleCatでは問題がなくても、アプリ側でいずれか1つでも繋がりが切れていると、SampleCatは成功し、アプリは失敗します。
解決手順
ステップ1: APIキーを確認する
最も多い原因です。Purchases.configure()の呼び出しが、SampleCatが使用しているものと正確に同じ公開APIキーを使用しているか再確認してください。
// iOS: キーは "appl_" で始まる必要があります
Purchases.configure(withAPIKey: "appl_YOUR_PUBLIC_KEY")
// Android: キーは "goog_" で始まる必要があります
Purchases.configure(this, "goog_YOUR_PUBLIC_KEY")sk_で始まる)を使用しないでください。RevenueCat Dashboard → Project Settings → API Keysで提供される公開キーを使用してください。
ステップ2: SDKの初期化タイミングを確認する
Purchases.configure()は、オファリングを取得する前に、アプリのライフサイクルのできるだけ早い段階で呼び出す必要があります。呼び出しが遅すぎたり条件付きだったりすると、オファリングをリクエストする時点でSDKが準備できていない可能性があります。
// iOS: AppDelegate または App init で設定
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Purchases.logLevel = .debug
Purchases.configure(withAPIKey: "appl_YOUR_KEY")
return true
}// Android: Application.onCreate() で設定
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
Purchases.logLevel = LogLevel.DEBUG
Purchases.configure(PurchasesConfiguration.Builder(this, "goog_YOUR_KEY").build())
}
}ステップ3: コールバックでエラーを確認する
オファリングを取得するときは、必ずerrorパラメータをチェックしてください。ここで静かに失敗していることが、「なぜか動かない」の最も多い原因です。
Purchases.shared.getOfferings { offerings, error in
if let error = error {
print("❌ Error fetching offerings: \(error.localizedDescription)")
return
}
guard let current = offerings?.current else {
print("⚠️ No current offering found")
return
}
print("✅ Current offering: \(current.identifier)")
print(" Packages: \(current.availablePackages.map { $0.identifier })")
}ステップ4: StoreKit Configurationを確認する(iOSシミュレーター専用)
iOSシミュレーターで実行する場合は、XcodeプロジェクトにStoreKit Configurationファイルが必要です。SampleCatにはデフォルトで含まれていますが、自分で作ったプロジェクトにはない可能性があります。
- XcodeでProduct → Scheme → Edit Scheme → Run → Optionsに移動します。
- StoreKit Configurationドロップダウンを確認します。
- "None" になっている場合は、一致するProduct IDでStoreKit Configurationファイルを作成するか、サンドボックスアカウントのある実機でテストします。
ステップ5: デバッグログを有効にして比較する
configure()の前にPurchases.logLevel = .debug(iOS)またはPurchases.logLevel = LogLevel.DEBUG(Android)を追加します。SampleCatとアプリの両方を実行し、デバッグ出力を比較します。次の項目に違いがないか確認してください。
- 使用中のAPIキー
- アプリユーザーID
- ストアから返された商品
- 初期化中に発生したエラーメッセージ
"Configuring Purchases with API key: appl_xxx"が表示され、そのキーがSampleCatが使用しているものと異なる場合、それが問題の原因です。
問題 6: 商品が "READY_TO_SUBMIT" ステータスになっている
症状
2つのログメッセージが連続して表示されます。まず、SDKは正しく設定されているものの、商品に問題があるという警告が表示されます。
WARN: ⚠️ 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.
Product Issues:
⚠️ monthly (monthly): This product's status (READY_TO_SUBMIT) requires you to take action
in App Store Connect before using it in production purchases.
⚠️ yearly (yearly): This product's status (READY_TO_SUBMIT) requires you to take action
in App Store Connect before using it in production purchases.
Offering Issues:
⚠️ default
⚠️ $rc_monthly (monthly): status (READY_TO_SUBMIT)
⚠️ $rc_annual (yearly): status (READY_TO_SUBMIT)次に、どの商品も取得できないというエラーが表示されます。
ERROR: 😿‼️ There is an issue with your configuration. Check the underlying error for more details.
More information: https://rev.cat/sdk-troubleshooting
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発生する原因
READY_TO_SUBMITステータスは、商品がApp Store Connectに存在するものの、審査用に提出されたことがないことを意味します。Appleは、アプリ内課金商品をアプリバージョンと一緒に提出するよう要求しています。審査を経て承認されるまでは、App Storeは本番環境でその商品をアプリに提供しません。
ここでの重要な手がかりは、WARNメッセージ自体にあります。"RevenueCat SDK is configured correctly." これは、RevenueCatダッシュボードの設定、APIキー、bundle IDがすべて正常であることを裏付けています。問題は完全にApp Store Connect側にあります。
商品ステータスを理解する
| ステータス | 意味 | 商品を取得できますか? |
|---|---|---|
| Ready to Submit | 商品は作成されましたが、審査用に提出されたことがありません。 | 不可(本番)。可(サンドボックス/StoreKit Config)。 |
| Waiting for Review | アプリバージョンと一緒に提出され、Appleの審査待ちです。 | 不可(本番)。可(サンドボックス/StoreKit Config)。 |
| Approved | Appleの審査を経て承認されました。 | 可。 |
| Developer Action Needed | Appleが商品を拒否したか、フラグを付けました。 | 不可。 |
| Missing Metadata | 商品が未完成の状態です(説明、価格、スクリーンショットの欠落)。 | 不可。 |
解決手順
ステップ1: App Store Connectで商品メタデータを完成させる
READY_TO_SUBMITステータスの各商品に、必要なメタデータがすべて揃っているか確認してください。
- App Store Connect → アプリ → Subscriptions(またはIn-App Purchases)に移動します。
- 各商品をクリックして、次の項目があるか確認します。
- Reference NameとProduct ID。
- 設定済みのSubscription Price、または1つ以上の価格ティア。
- 表示名と説明を含むLocalization。
- Review Screenshot(アプリで商品を表示しているスクリーンショット)。
ステップ2: 商品をアプリバージョンと一緒に提出する
アプリ内課金商品は、新しいアプリバージョンと一緒に提出する必要があります。
- App Store Connectでアプリに移動し、新しいバージョンを作成します(または保留中のバージョンを使用します)。
- In-App Purchases and Subscriptionsセクションまでスクロールします。
- +ボタンをクリックして商品を選択します。
- そのバージョンを審査用に提出します。
「購入をテストするには審査用に提出する必要がありますか?」
完全に別個の2つの事柄があります。
| App Store審査用の提出 | 開発中の購入テスト | |
|---|---|---|
| 役割 | App Storeで実際のユーザーに商品を提供します。 | リリース前に連携が正しく動作するか確認できます。 |
| 必要条件 | スクリーンショット、キーワード、説明、審査メモを含む完全なアプリバージョン。 | StoreKit Configurationファイル、またはサンドボックステスターアカウントだけで十分です。 |
| 必要な商品ステータス | 審査後、商品が "Approved" ステータスである必要があります。 | "Ready to Submit" で十分です。 |
| 必要なビルド | App Store Connectを通じてビルドを審査用に提出する必要があります。 | Xcodeから実行するか、TestFlightでインストールします。 |
| 所要時間 | Appleの審査に24〜48時間。 | 即時(StoreKit Config)または数分(サンドボックス)。 |
ステップ3: 承認を待たずにテストする
"Ready to Submit" の商品で、今すぐ購入をテストできます。次のいずれかの方法を選択してください。
オプションA: StoreKit Configuration File(推奨、最速)
最も速いテスト方法です。Appleへの依存なしにオフラインで動作します。
- XcodeでFile → New → File → StoreKit Configuration Fileに移動します。
- App Store Connectと正確に同じProduct IDで各商品を追加します。
- 商品タイプ、価格、期間をApp Store Connectの設定と一致するように設定します。
- Product → Scheme → Edit Scheme → Run → Optionsに移動します。
- StoreKit Configurationで新しく作成した
.storekitファイルを選択します。 - ビルドして実行します。商品が即座に読み込まれます。
オプションB: サンドボックステスト(実機)
Appleのサンドボックスサーバーに対してテストするため、実際の本番環境により近くなります。
- App Store Connect → Users and Access → Sandbox Testersでサンドボックステスターを作成します。
- テストデバイスでSettings → App Store → Sandbox Accountに移動し、サンドボックスの認証情報でサインインします。
- XcodeスキームのStoreKit Configurationが"None"に設定されているか確認します(ローカルファイルではなく実際のサンドボックスを使用するため)。
- デバイスでアプリを実行します。"Ready to Submit" の商品をサンドボックスで使用できます。
オプションC: RevenueCat Test Store
Appleのインフラを一切必要とせず、高速かつ決定論的なテストを行うには、RevenueCatのTest Storeを使用してください。サンドボックスアカウントもStoreKitファイルも不要です。
問題 7: RevenueCatの設定が正しいのにStoreKitが商品を解決できない(iOS)
症状
RevenueCatダッシュボードとAPIには、正しい商品識別子でオファリングが正常に設定されています。App Store Connectにも商品が存在します。ところが、アプリがPurchases.shared.offerings()を呼び出すと、availablePackages配列が空のまま返ってきます。エラーは発生しませんが、商品が表示されません。
let offerings = try await Purchases.shared.offerings()
// offerings.current は存在するが:
print(offerings.current?.availablePackages.count) // 0重要な診断の手がかりがあります。RevenueCat REST APIを直接照会すると、オファリングと商品が正しく返されます。ギャップは「RevenueCatサーバーは商品を知っている」と「StoreKitがデバイス上で商品を解決できない」の間にあります。
発生する原因
getOfferings()が呼び出されると、RevenueCat SDKは2つのステップを実行します。
- RevenueCatサーバーからオファリング構成を取得します(オファリング識別子、パッケージ識別子、Product ID)。ダッシュボードが正しく設定されているため、このステップは成功します。
- Appleの
Product.products(for:)(StoreKit 2)またはSKProductsRequest(StoreKit 1)を呼び出して、StoreKitで商品識別子を解決します。StoreKitがProduct IDを解決できない場合、そのパッケージはフィルタリングされて除外され、availablePackagesが空になります。
AppleのStoreKitにはバイナリによるアクティベーション手順が必要です。アプリで特定のProduct IDを初めて使用する際、Appleがその商品識別子をアプリに関連付けるには、App Store Connectにアップロードされたアプリバイナリを少なくとも1つ処理する必要があります。この処理が完了するまでは、App Store Connectに商品が存在していてもStoreKitは商品を解決できません。
主に発生するケース
- まったく新しい商品: App Store Connectでアプリ内課金商品を作成したばかりです。
- 初めてのアプリ提出: アプリにApp Store Connectへアップロードされたバイナリが一度もありません。
- 新しいProduct IDの追加: 既存のアプリに新しい商品を追加しましたが、作成後にビルドを提出していません。
他の問題と区別する方法
| 確認項目 | 結果 | 解釈 |
|---|---|---|
| RevenueCat REST APIがオファリングを返す | はい、商品を含む | RevenueCatの設定は正しいです。 |
| App Store Connectに商品が存在する | はい、ダッシュボードに表示される | 商品は作成されています。 |
SDKにofferings.currentが存在する | はい | SDKはオファリング構成を正常に取得しています。 |
availablePackagesの数 | 0 | StoreKitがProduct IDを解決できませんでした。 |
| XcodeにStoreKit Configurationファイルが設定されている | いいえ | アプリはローカルのStoreKitではなくAppleサンドボックスを使用しています。 |
すべての行がこのパターンと一致する場合、StoreKitの商品アクティベーションが問題です。
解決手順
ステップ1: App Store Connectにバイナリをアップロードする
アプリ内課金のProduct IDを参照するビルドを、XcodeまたはCI/CDで提出します。
- Xcodeでアプリをアーカイブします(Product → Archive)。
- Distribute App → App Store Connectを通じてApp Store Connectにアップロードします。
- または
xcodebuildやFastlaneを使用してアップロードします。 - Appleがビルドを処理するまで待ちます(通常15〜30分、より長くかかることもあります)。
ビルドを審査用に提出する必要はありません。App Store Connectにアップロードするだけで(TestFlightで利用可能にするだけで)、アクティベーションをトリガーするのに十分です。
ステップ2: Appleの処理を待つ
ビルドのアップロード後は、次のように進みます。
- Appleがバイナリを処理し、商品識別子をアプリに関連付けます。
- 15分から数時間かかることがあります。
- App Store ConnectのTestFlightでビルドの処理状況を確認できます。
- TestFlightでビルドが "Ready to Test" と表示されると、商品の解決が始まります。
ステップ3: 再度テストする
ビルドが処理された後は、次のように進めます。
- TestFlightからビルドをデバイスにインストールするか、サンドボックスアカウントのあるデバイスでXcodeから実行します。
Purchases.shared.offerings()を再度呼び出します。- これで
availablePackagesにデータが入っているはずです。
代替手段: すぐにテストするにはStoreKit Configuration Fileを使用する
バイナリのアクティベーションを待たずに今すぐテストする必要がある場合は、次のように進めます。
- XcodeでStoreKit Configuration Fileを作成します(File → New → File → StoreKit Configuration File)。
- App Store Connectと正確に同じProduct IDで商品を追加します。
- Product → Scheme → Edit Scheme → Run → Optionsに移動します。
- StoreKit Configurationファイルを選択します。
- ローカル構成を使用して、商品が即座に解決されます。
問題 8: iOSで "No Subscriptions Available"(Androidから移行してきた場合)
症状
RevenueCatの設定(商品、オファリング、パッケージ、APIキー)をすべて完了したのに、iOSでテストするとアプリに次のようなエラーが表示されます。
Error: no subscriptions available. Try again later.これは、特にAndroid/Google Playの経験があり、iOSを初めて設定する開発者によく見られます。RevenueCat側は正しく設定されていますが、Apple側の何かが商品の読み込みを妨げています。
最も多い原因: Paid Applications Agreement
iOSを初めて扱う開発者にとって最大の原因は、Paid Applications Agreementが未署名または未完了の場合です。Google Playと異なり、Appleはあらゆるアプリ内課金商品が動作する前に、たとえサンドボックスであっても、事業者情報と銀行情報の入力を完了するよう要求します。
これを解決するには、次のように進めます。
- App Store Connectに移動します。
- Business(旧称 "Agreements, Tax, and Banking")に移動します。
- ページ上部にバナーや警告がないか確認します。
- 次のセクションを完了します。
- Paid Applications Agreement: Active状態と表示されている必要があります。"Pending" や "New" と表示されている場合は、クリックして規約に同意します。
- Banking Information: 銀行口座情報を追加します。
- Tax Forms: 必要な税務フォームを記入します(米国はW-9、米国以外の開発者はW-8BEN)。
- Appleが情報を検証するまで最大24〜48時間待ちます(銀行情報の検証には時間がかかることがあります)。
その他の原因(Android開発者が見落としがちなiOS特有の落とし穴)
Paid Applications Agreementがすでに有効になっている場合は、Androidには対応する項目がないiOS特有の要件チェックリストを確認してください。
| # | iOSの要件 | Androidの対応項目 | 確認方法 |
|---|---|---|---|
| 1 | Paid Applications Agreement | 対応項目なし(Googleは販売者アカウントのみ必要)。 | App Store Connect → Businessで "Active" と表示されている必要があります。 |
| 2 | StoreKit Configuration File(シミュレーターテスト用) | 対応項目なし(Google Play BillingはPlay Storeのあるエミュレーターで動作)。 | Xcode → Product → Scheme → Edit Scheme → Run → Options → StoreKit Configuration。 |
| 3 | App Store Connectにアップロードされたバイナリ(サンドボックス用) | 対応項目: Internal Testingトラックに公開されたアプリ。 | App Store Connect → TestFlightで処理済みビルドを確認。 |
| 4 | サンドボックステスターアカウント | 対応項目: Play ConsoleのLicense Tester。 | App Store Connect → Users and Access → Sandbox Testers。 |
| 5 | In-App Purchase Key(SDK v5以降/StoreKit 2用) | 対応項目: サービスアカウントのJSONキー。 | RevenueCat Dashboard → Apps & providers → App Store → In-App Purchase Key。 |
| 6 | bundle IDの一致 | 対応項目: パッケージ名の一致。 | Xcode target → General → Bundle IdentifierがRevenueCat → Apps & providersと一致している必要があります。 |
問題 9: ConfigurationError: APIキーのプラットフォームとオファリングの商品が一致しない
エラーメッセージ
[RevenueCat] 😿‼️ Error fetching offerings -
PurchasesError(code=ConfigurationError, underlyingErrorMessage=You have configured the SDK
with a Play Store API key, but there are no Play Store products registered in the RevenueCat
dashboard for your offerings. If you don't want to use the offerings system, you can safely
ignore this message. To configure offerings and their products, follow the instructions in
https://rev.cat/how-to-configure-offerings.
More information: https://rev.cat/why-are-offerings-emptyApp Store版のバリエーションもあります。この場合は "an App Store API key, but there are no App Store products registered" と表示されます。
発生する原因
SDKは、設定されたAPIキーに一致するストアからのみ商品を取得できます。このエラーは、現在(Current)のオファリングのパッケージに、そのストア用の商品が1つもないことを意味します。典型的なシナリオ: iOSを先に設定してすべてのパッケージにApp Store商品だけを連携しておき、その後goog_キーでAndroidビルドを開始した場合です。オファリング自体は正常ですが、Play Storeの観点では空の状態です。
逆方向(Androidが先、iOSが後)でも同様に発生し、React NativeやFlutterアプリでAndroidにappl_キーを(またはiOSにgoog_キーを)渡してしまうクロスプラットフォームのバリエーションもあります。
解決手順
ステップ1: 使用中のキーがどのストア用か確認する
デバッグログは起動時にキーを出力します。appl_ならApp Store、goog_ならGoogle Playから商品を取得します。クロスプラットフォームアプリの場合は、キーが1つのストアにハードコーディングされておらず、実行時にプラットフォームごとに選択されているか確認してください。
ステップ2: 不足しているストア用の商品を作成する
- RevenueCatダッシュボードでProduct Catalog → Productsに移動し、+ Newをクリックします。
- エラーに示されたストア(例: Google Play)を選択し、そのストアのコンソールにあるとおりに商品識別子を入力します。Playのサブスクリプションは、必要に応じて
productId:basePlanId形式を使用します。
ステップ3: すべてのパッケージに新しい商品を連携する
- Product Catalog → Offeringsに移動し、現在のオファリングを開きます。
- 各パッケージを編集し、既存の商品の横に新しいストアの商品を連携します。パッケージは、リリースするストアごとに商品を1つずつ持つ必要があります。
- 保存後、アプリを再起動します(オファリングは約5分間キャッシュされます)。すべてのパッケージにアクティブなストア用の商品が連携されると、エラーは解消されます。
getOfferings()ベースであれば、このエラーが根本原因なので無視してはいけません。
問題 10: 特定のユーザーや特定の国でのみオファリングが空になる
症状
自分のデバイスではオファリングが正常に読み込まれるのに、他の国のテスターや本番ユーザーには空のペイウォールが表示されます。あるいは逆に、自分だけ失敗し、サポートチームからは設定が正しいと回答されるケースです。
発生する原因
どちらのストアも、ユーザーのストアフロントの国を基準に商品を提供します。商品の販売可能地域が特定の国に制限されていると、それ以外の地域のユーザーは何も受け取れません。実際にコミュニティスレッドでは、サブスクリプションがドイツでのみ有効になっていたために英国のユーザー全員に空のオファリングが表示されていた事例が、この方法で解決されました。
解決手順
iOSの場合:
- App Store Connectで各サブスクリプションまたはアプリ内課金商品を開き、Availability(販売可能状況)を確認します。
- 自分、テスター、ユーザーがいるすべての国が含まれているか確認します。
- サンドボックステスターアカウントにも国があることを忘れないでください。誤ったストアフロントで作成したサンドボックスアカウントは、自分のデスクでもこのバグを再現します。
Androidの場合:
- Play Consoleでリリース → 製品版 → 国/地域からアプリの国別提供状況を確認します。
- 各サブスクリプションの基本プラン(base plan)に該当地域の価格が設定されているか確認します。
問題 11: Android実機チェックリスト: 実機でオファリングが空になる
症状
ダッシュボードの設定が完了しており、Play Consoleで商品がActive状態で、アプリもテストトラックにアップロードされているのに、実機では依然として空のオファリングやITEM_UNAVAILABLEが発生します。
発生する原因
Google Playは、デバイスとアカウントの単位で商品の提供可否を判断します。「テストトラックにアップロードされている」ことは必要条件であって十分条件ではありません。デバイスのアカウントがオプトインを完了したテスターであり、かつPlayが自身のチャネルを通じてアプリがインストールされたことを少なくとも1回は確認している必要があります。
解決手順
ステップ1: 追加するだけでなくオプトインまで完了する
- Play Consoleでトラックを開き、オプトインリンク(「テスターがテストに参加する方法」)をコピーします。
- テスターアカウントでログインしたデバイスでそのリンクを開き、テスターになるをタップします。テスターリストにメールアドレスを追加するだけでは不十分です。
ステップ2: Google Play経由で少なくとも1回インストールする
テストトラックのリンクからアプリを少なくとも1回インストールします。Playがアプリとアカウントを関連付けた後は、同じapplicationIdでローカルビルドしたデバッグビルドでも商品を取得できます。
ステップ3: デバイスのPlayアカウントを確認する
- テスターアカウントがデバイスのデフォルトのGoogle Playアカウントであるか、少なくともPlay Storeが使用中のアカウントである必要があります。複数アカウントのデバイスでは、Play Storeのアカウントを切り替えるか、Play Storeのデータを削除してください。
- エミュレーターは "Google APIs" ではなくGoogle Play Storeシステムイメージが必要で、テスターアカウントでログインしている必要があります。
ステップ4: 認証情報の反映を待つ(最大36時間)
RevenueCatのPlayサービス認証情報(Apps & providers → Google Play)を作成してから36時間経過していない場合、Googleがまだ反映処理中の可能性があります。知られている高速化のコツ: Play Consoleで任意の商品の説明を編集して保存すると、Googleのキャッシュが更新されます。
ステップ5: 署名とapplicationIdを確認する
build.gradleのapplicationIdがPlay Consoleと正確に一致している必要があります。.debugのようなビルドタイプのサフィックスは一致を壊します。- アップロードされたビルドは、署名済みのリリースビルド(AAB)である必要があります。公開され処理が完了したビルドがないトラックは、Playに無視されます。
よくある問題のクイックリファレンス
| 問題 | 考えられる原因 | 解決方法 |
|---|---|---|
ConfigurationError: "Play Store API key, but there are no Play Store products registered" |
現在のオファリングのパッケージに別のストア用の商品しかないか、実行時に誤ったプラットフォームのキーを使用している。 | エラーに示されたストア用の商品を作成し(Product Catalog → Products)、現在のオファリングのすべてのパッケージに連携します。クロスプラットフォームアプリは、プラットフォームごとにappl_/goog_キーを選択する必要があります。上記の詳細ガイドを参照してください。 |
| 特定の国でのみオファリングが空になる | 商品またはアプリの販売可能地域が特定の国に制限されている。 | iOS: App Store Connectで各商品のAvailability(およびサンドボックスアカウントの国)を確認します。Android: Play Consoleで国別の提供状況と基本プランの地域別価格を確認します。上記の詳細ガイドを参照してください。 |
Android: 実機で空のオファリング / ITEM_UNAVAILABLE |
テスターのオプトイン未完了、Play経由のインストール履歴なし、誤ったPlayアカウント、または認証情報の反映待ち。 | テスターアカウントでトラックのオプトインリンクを開いて承諾し、Play経由で1回インストールし、デバイスのPlay Storeアカウントを確認し、Playサービス認証情報の作成後最大36時間待ちます。上記の詳細ガイドを参照してください。 |
| "No subscriptions available"(iOSの初回設定) | Paid Applications Agreementが未署名、または銀行情報が未完了。 | App Store Connect → Businessに移動します。Paid Applications Agreement、銀行情報、税務フォームを完了します。すべてのセクションがActive/完了状態と表示されている必要があります。検証に最大48時間待ちます。上記の詳細ガイドを参照してください。 |
RevenueCat APIは動作するがavailablePackagesが空 |
StoreKitがまだProduct IDをアクティベートしていない(バイナリ未アップロード)。 | App Store Connectにビルドをアップロードします(TestFlight用途だけでも可)。Appleが処理するまで待ちます(15分から数時間)。ビルドが "Ready to Test" になると、StoreKitが商品の解決を開始します。上記の詳細ガイドを参照してください。 |
| "None of the products could be fetched" | RevenueCatのProduct IDがストアと一致しない。 | App Store ConnectまたはGoogle Play ConsoleからProduct IDをコピーします。RevenueCatダッシュボード → Product Catalog → Productsで、各IDが大文字・小文字まで正確に一致しているか確認します。末尾にスペースが1つあるだけでも不一致になります。 |
| "None of the products could be fetched" | ストアで商品が承認されていないか、アクティブでない。 | iOSの場合、商品がAppleに承認されているか、StoreKit Configuration Fileでテストする必要があります。Androidの場合、Google Play Consoleで商品がActive状態であり、アプリが少なくともInternal Testingに公開されている必要があります。 |
| "None of the products could be fetched" | プラットフォームに合わないAPIキー。 | iOSアプリはappl_で始まるAPIキーを、Androidアプリはgoog_で始まるキーを使用する必要があります。Purchases.configure()の呼び出しを確認し、RevenueCatダッシュボード → API keysでキーを確認してください。 |
| offeringsオブジェクトが空 | オファリングにパッケージが追加されていない。 | RevenueCatダッシュボード → Product Catalog → Offerings → 該当のオファリングでEditをクリックしてパッケージを追加します(例: $rc_monthly、$rc_annual)。各パッケージには少なくとも1つの商品を連携する必要があります。 |
| offeringsオブジェクトが空 | デフォルトのオファリングが未設定。 | Product Catalog → Offeringsで、メインのオファリングに "Current" バッジが表示されているか確認します。表示されていない場合は、そのオファリングをクリックしてMake Currentを選択します。offerings.currentプロパティはデフォルトのオファリングを返します。 |
| offeringsオブジェクトが空 | 商品は連携されているが、現在のプラットフォーム用の商品が欠けている。 | 各パッケージには、テスト中のプラットフォームに合った商品が必要です。iOSをテストする場合はApp Store商品を、Androidをテストする場合はGoogle Play商品を連携します。オファリングエディタで各パッケージの商品リストを確認してください。 |
| "offerings.current" がnilを返す | コードで誤ったオファリング識別子を使用している。 | offerings.offering(identifier:)を使用している場合は、識別子がRevenueCatダッシュボードと一致しているか確認します。デフォルトのオファリングには、代わりにofferings.currentを使用してください。識別子の文字列にタイプミスがないか確認します。 |
| 商品価格が$0.00と表示される | ストアが価格情報を取得できていない。 | 通常、ストアが商品を解決できていないことを意味します。商品がストアに存在し、アクティブ状態か確認します。iOSではStoreKit Configurationに適切な価格が含まれているか確認します。Androidでは商品に価格が設定された基本プラン(base plan)があるか確認してください。 |
| オファリングの取得が止まるかタイムアウトする | ネットワーク接続の問題。 | デバイスのインターネット接続を確認します。VPNやプロキシを一時的に無効にします。api.revenuecat.comがファイアウォールでブロックされていないか確認します。一時的な失敗に備えて、アプリに指数バックオフを用いたリトライロジックを追加してください。 |
| オファリングの取得が止まるかタイムアウトする | 取得前にRevenueCat SDKが設定されていない。 | オファリングを取得する前にPurchases.configure()が呼び出されているか確認します。iOSではAppDelegate.application(_:didFinishLaunchingWithOptions:)で、AndroidではApplication.onCreate()で設定してください。 |
| ストアの更新後に商品が消えた | SDKキャッシュが古いデータを返している。 | Purchases.shared.invalidateCustomerInfoCache()を呼び出してキャッシュをクリアします。その後、オファリングを再取得します。問題が続く場合は、アプリを強制終了してから再度開きます。 |
| ダッシュボードに "Configuration warning" が表示される | オファリングの商品が、存在しないストア商品を参照している。 | RevenueCatダッシュボードに移動して設定警告を確認します。各Product IDをストアと照合します。App Store ConnectまたはGoogle Play Consoleにもう存在しない商品は、削除または更新してください。 |
| Androidエミュレーターでオファリングが空 | エミュレーターにGoogle Play Storeまたは決済サポートがない。 | テストには実際のAndroidデバイスを使用するか、Google Play Storeがインストールされた("Google APIs" のみではない)エミュレーターを使用してください。ライセンス付与されたテスターのGoogleアカウントでログインします。ローカルのデバッグビルドでも、テストトラックへのアップロードが必要な場合があります。コミュニティディスカッションを参照してください。 |
| 商品が "READY_TO_SUBMIT" ステータスになっている | App Store Connectで商品が作成されたが、審査用に提出されたことがない。 | アプリ内課金商品は、Appleの審査のためにアプリバージョンと一緒に提出する必要があります。商品メタデータ(価格、Localization、スクリーンショット)をすべて完成させた後、新しいアプリバージョンに追加して審査用に提出します。テストにはStoreKit Configurationファイルやサンドボックスアカウントを使用してください。上記の詳細ガイドを参照してください。 |
| SampleCatではオファリングが動作するが自分のアプリでは動作しない | アプリのPurchases.configure()呼び出しで誤ったAPIキーを使用している。 |
SampleCatと正確に同じ公開APIキーを使用しているか確認します。RevenueCat Dashboard → Project Settings → API Keysを確認してください。iOSはappl_プレフィックスを、Androidはgoog_プレフィックスを使用しているか確認します。上記の詳細ガイドを参照してください。 |
| SampleCatではオファリングが動作するが自分のアプリでは動作しない | SDKが設定されていないか、設定が遅すぎる。 | オファリングを取得する前に、Purchases.configure()がAppDelegate.didFinishLaunching(iOS)またはApplication.onCreate()(Android)で呼び出されているか確認します。デバッグログを有効にして初期化の順序を確認してください。 |
| SampleCatではオファリングが動作するが自分のアプリでは動作しない | iOSシミュレーターにStoreKit Configurationファイルがない。 | SampleCatにはStoreKit Configurationファイルが含まれています。自分で作ったプロジェクトにはない可能性があります。Product → Scheme → Edit Scheme → Run → Optionsに移動してStoreKit Configurationを設定します。または、サンドボックスアカウントのある実機でテストしてください。 |
| TestFlightではオファリングが動作するがXcodeビルドでは動作しない | 適切なサンドボックス設定がないまま、StoreKit Configurationが "None" に設定されている。 | StoreKit Configurationが "None" の状態でXcodeから実行すると、Appleサンドボックスが使用されます。デバイスでサンドボックステスターとしてログインしているか確認してください。または、ローカルテスト用に一致するProduct IDでStoreKit Configurationファイルを関連付けます。コミュニティディスカッションを参照してください。 |
| App Store審査中にオファリングがタイムアウトする | Appleの審査環境にネットワーク制限がある。 | Appleの審査インフラの一時的な問題です。アプリがオファリングの読み込み失敗を適切に処理するようにしてください(空の画面ではなくリトライボタンを表示)。アプリを再度審査用に提出します。コミュニティディスカッションを参照してください。 |
Expo/React Native: getProducts()が空を返す |
development buildではなくExpo Goを使用している。 | Expo GoはRevenueCatのようなネイティブモジュールをサポートしていません。EAS Buildでdevelopment buildを作成してください。react-native-purchasesが正しくリンクされているか確認します。Androidの場合は、アプリをテストトラックにアップロードする必要があります。コミュニティディスカッションを参照してください。 |
オファリング問題のデバッグチェックリスト
- ☐ RevenueCatダッシュボードに商品が存在する。
- ☐ Product IDがストアと大文字・小文字まで正確に一致している。
- ☐ オファリングに商品が連携されたパッケージがある。
- ☐ デフォルトのオファリングが設定されている。
- ☐ bundle ID / パッケージ名が一致している。
- ☐ APIキーがプラットフォームに合っている(appl_ または goog_)。
- ☐ ネットワーク接続が利用できる。
- ☐ 商品が "Ready to Submit" ではなく、承認済み(iOS)またはActive(Android)状態である。
- ☐ すべてのパッケージに、使用中のAPIキーのプラットフォーム用の商品が連携されている(ConfigurationErrorなし)。
- ☐ iOS: Paid Applications AgreementがActive状態で、銀行・税務情報が完了している。
- ☐ 商品とアプリの販売可能地域にテスターの国が含まれている。
- ☐ Android: テスターがトラックのリンクからオプトインし、Play経由で少なくとも1回アプリをインストールしている。
- ☐ Android: Playサービス認証情報が有効で、作成から36時間経過している。
- ☐ デバッグログが有効になっている。
- ☐ 有効な認証情報(サンドボックスまたはTest Store)でテストしている。