ペイウォール設定の問題
0:06:00ペイウォールの問題は、通常、画面表示の問題、商品の欠落、購入ボタンが動作しないことに関連しています。このステップでは、よく発生するペイウォール設定の問題を扱います。
問題1:ペイウォールが表示されない
症状
- ペイウォール画面が表示されません。
- ペイウォールが表示されるはずの場所に空白の画面が表示されます。
- ペイウォールを表示しようとするとクラッシュが発生します。
一般的な原因
- 公開済みのペイウォールがない:ペイウォールが下書きの状態のままで、公開されていません。
- RevenueCatUI依存関係の欠落:UIライブラリをimportしていません。
- ペイウォールがオファリングに紐付けられていない:オファリングに紐付けられたペイウォールがありません。
- 誤ったオファリングのリクエスト:ペイウォールのないオファリングをコードでリクエストしています。
解決手順
ステップ1:ペイウォールが公開されているか確認する
- RevenueCatダッシュボードに移動します。
- Paywallsに移動します。
- ペイウォールのステータスを確認します。
- Draft:まだライブ状態ではありません。
- Published:ライブ状態で、使用できます。
- まだ下書きの状態であれば、Publishをクリックします。
ステップ2:RevenueCatUI依存関係を確認する
iOS (SPM):
swift
// コードで次をimportできることを確認します。
import RevenueCat
import RevenueCatUI // ← ペイウォールを使用するには必須ですiOS (CocoaPods):
ruby
pod 'RevenueCat'
pod 'RevenueCatUI' # ← この行を追加しますAndroid (Gradle):
kotlin
// purchasesだけでなくpurchases-uiを使用します
implementation("com.revenuecat.purchases:purchases-ui:10.8.0")ステップ3:ペイウォールがオファリングに紐付けられているか確認する
- RevenueCatダッシュボードでPaywallsに移動します。
- 該当するペイウォールをクリックします。
- Offeringフィールドに正しいオファリング識別子が表示されているか確認します。
- 設定されていない場合は、編集してオファリングを選択します。
ステップ4:コードの実装を確認する
iOS (SwiftUI):
swift
import RevenueCatUI
struct ContentView: View {
@State private var showPaywall = false
var body: some View {
Button("Show Paywall") {
showPaywall = true
}
.presentPaywallIfNeeded(
requiredEntitlementIdentifier: "premium",
isPresented: $showPaywall
)
}
}Android (Compose):
kotlin
import com.revenuecat.purchases.ui.revenuecatui.Paywall
@Composable
fun MyScreen() {
var showPaywall by remember { mutableStateOf(false) }
if (showPaywall) {
Paywall(
onDismiss = { showPaywall = false }
)
}
}問題2:ペイウォールに商品が表示されない
症状
- ペイウォールは表示されますが、商品カードが空になっています。
- 価格が$0.00または空の値で表示されます。
- 商品のタイトルや説明が欠落しています。
一般的な原因
- パッケージ識別子の不一致:ペイウォールが別のパッケージ識別子を期待しています。
- 商品が利用できない:ストア商品を取得できません。
- ローカライズの欠落:ユーザーのロケールに合った商品情報が設定されていません。
- 空のオファリング:オファリングに商品がありません。
解決手順
ステップ1:パッケージ識別子が一致しているか確認する
- Paywall Editorでどのパッケージ識別子が使用されているか確認します。
- よく使われるパッケージ識別子は次のとおりです。
$rc_monthly$rc_annual$rc_lifetime
- Product Catalog → Offeringsでパッケージがこの識別子を使用しているか確認します。
- カスタム識別子を使用している場合は、一致するようにペイウォールを更新します。
ステップ2:商品の取得をテストする
swift
// 商品が正常に取得できるかテストします
let offerings = try await Purchases.shared.offerings()
if let offering = offerings.current {
for package in offering.availablePackages {
print("Package: \(package.identifier)")
print(" Product: \(package.storeProduct.localizedTitle)")
print(" Price: \(package.storeProduct.localizedPriceString)")
}
} else {
print("No current offering")
}このコードで商品が正常に出力されるのに、ペイウォールには商品が表示されない場合は、ペイウォール設定の問題です。
ステップ3:商品のローカライズを確認する
iOSの場合(App Store Connect):
- App Store Connectで該当する商品に移動します。
- Localizationセクションを確認します。
- ユーザーの言語と地域に合ったローカライズを追加します。
- 表示名と説明を入力します。
Androidの場合(Google Play Console):
- Google Play Consoleで該当する商品に移動します。
- Translationsを確認します。
- 対象言語の翻訳を追加します。
問題3:購入ボタンが動作しない
症状
- 購入ボタンを押しても何も起こりません。
- ボタンを押すとローディングが表示されますが、終わりません。
- 購入を試みるとエラーが表示されます。
一般的な原因
- 購入デリゲートの未設定:購入完了を処理するハンドラーがありません。
- エンタイトルメント確認の失敗:ユーザーがすでにエンタイトルメントを保有していますが、UIに反映されていません。
- トランザクションが完了しない:トランザクションを自動的に完了しないようにSDKが設定されています。
- ネットワークの問題:ストアのサーバーと通信できません。
解決手順
ステップ1:購入コールバックを実装する
iOS:
swift
.presentPaywallIfNeeded(
requiredEntitlementIdentifier: "premium",
purchaseCompleted: { customerInfo in
// 購入成功の処理
print("Purchase completed! Access granted.")
},
restoreCompleted: { customerInfo in
// リストアの処理
print("Restore completed!")
}
)Android:
kotlin
Paywall(
onPurchaseCompleted = { customerInfo ->
// 購入成功の処理
Log.d("Paywall", "Purchase completed!")
},
onRestoreCompleted = { customerInfo ->
// リストアの処理
Log.d("Paywall", "Restore completed!")
},
onDismiss = { showPaywall = false }
)ステップ2:自動完了が有効になっているか確認する
SDKの設定でトランザクションが自動的に完了することを確認します。
swift
// iOS - デフォルトのため追加の設定は不要です
Purchases.configure(withAPIKey: "appl_xxx")kotlin
// Android - この設定がされているか確認します
val builder = PurchasesConfiguration.Builder(this, "goog_xxx")
Purchases.configure(
builder
.purchasesAreCompletedBy(PurchasesAreCompletedBy.REVENUECAT) // ← 重要!
.build()
)ステップ3:デバッグロギングを有効にする
購入ボタンを押したときに何が起こるか確認します。
swift
// iOS
Purchases.logLevel = .debugkotlin
// Android
Purchases.logLevel = LogLevel.DEBUGよくある問題のクイックリファレンス
| 問題 | 考えられる原因 | 解決方法 |
|---|---|---|
| ペイウォールが表示されない | ペイウォールがまだ下書きの状態です。 | RevenueCatダッシュボード → Paywallsでステータス列を確認します。Draftと表示されている場合は、ペイウォールを開いてPublishをクリックします。公開済みのペイウォールのみがSDKに配信されます。 |
| ペイウォールが表示されない | RevenueCatUI依存関係が追加されていません。 | iOSではSPMまたはCocoaPodsでRevenueCatUIを追加します。Androidではbuild.gradleにcom.revenuecat.purchases:purchases-uiを追加します。メインのSDKにはペイウォールUIコンポーネントは含まれていません。 |
| ペイウォールが表示されない | ペイウォールがオファリングに紐付けられていません。 | RevenueCatダッシュボード → Paywallsでペイウォールを開き、Offeringフィールドを確認します。正しいオファリング識別子を選択します。ペイウォールを表示するには、必ずオファリングに紐付けられている必要があります。 |
| カスタムデザインの代わりにデフォルト/フォールバックのペイウォールが表示される | SDKバージョンがPaywalls v2をサポートしていません。 | 最新のSDKバージョンに更新します。Paywalls v2にはpurchases-ios v5.x以上とpurchases-android v8.x以上が必要です。依存関係のバージョンを確認し、必要に応じて更新します。 |
| カスタムデザインの代わりにデフォルト/フォールバックのペイウォールが表示される | 「default」という名前のペイウォールが競合を引き起こします。 | RevenueCatダッシュボードでペイウォール名を「default」以外の名前に変更します。「default」という名前はSDK内部のロジックと競合し、フォールバック動作を引き起こす可能性があります。 コミュニティの議論を参照してください。 |
| カスタムデザインの代わりにデフォルト/フォールバックのペイウォールが表示される | Paywall Editorで文字列のローカライズが欠落しています。 | デバッグログで "Missing string localization for property" という警告を確認します。Paywall Editorでユーザーのロケールに合ったすべてのテキストフィールドが入力されているか確認します。ローカライズが欠落すると、バリデーションエラーが発生してフォールバックのペイウォールが表示されます。 |
| ペイウォールの商品カードが空になっている | ペイウォールとオファリングの間でパッケージ識別子が一致していません。 | Paywall Editorでどのパッケージ識別子が使用されているか確認します(例:$rc_monthly、$rc_annual)。Product Catalog → Offeringsでパッケージが同じ識別子を使用しているか確認します。識別子が一致しないと、商品カードが空になります。 |
| ペイウォールの商品カードが空になっている | ユーザーのストアフロントで商品が利用できません。 | 一部の地域では商品が利用できない場合があります。App Store ConnectまたはGoogle Play Consoleでテスターの国における商品の利用可否を確認します。必要に応じて欠落している地域を追加します。 |
| 価格が$0.00または空の値で表示される | ストアが商品の価格を確認できません。 | ストアで商品がアクティブな状態で、価格が設定されているか確認します。StoreKit Configurationを使用するiOSでは、各商品に価格とロケールが設定されているか確認します。Androidでは、基本プランに価格が設定されているか確認します。 |
| 購入ボタンを押しても何も起こらない | トランザクションが自動的に完了しません。 | カスタムの購入処理を使用している場合は、Purchases.shared.purchase(package:)を呼び出して完了を処理しているか確認します。RevenueCatUIを使用すれば購入は自動的に処理されます。finishTransactionsがfalseに設定されていないか確認します。 |
| 購入ボタンを押しても何も起こらない | ユーザーがすでにアクティブなエンタイトルメントを保有しています。 | ユーザーがすでに商品を保有している場合、SDKがサイレントに成功として処理することがあります。ペイウォールを表示する前にcustomerInfo.entitlements.activeを確認します。Purchases.shared.getCustomerInfo()で現在のエンタイトルメントの状態を確認します。 |
| ペイウォールのリストアボタンが動作しない | 該当するアカウントにリストアできる過去の購入履歴がありません。 | リストアは、ストアアカウントに過去の購入履歴がある場合にのみ動作します。サンドボックステストでは、元の購入を行ったのと同じサンドボックステスターを使用します。 コミュニティの議論を参照してください。 |
| ペイウォールが表示された直後に閉じる | ユーザーのエンタイトルメント確認が通過し、自動的に閉じられます。 | エンタイトルメントに応じて自動的に閉じるようにPaywallViewやPaywallDialogを使用している場合、ユーザーがすでにアクティブなサブスクリプションを保有していると、ペイウォールが閉じられます。表示する前にユーザーのエンタイトルメントの状態を確認します。 |
| ペイウォールがAndroidとiOSで異なって見える | プラットフォームごとのレンダリングの違いです。 | ペイウォールテンプレートは、プラットフォームごとに少しずつ異なってレンダリングされることがあります。Paywall EditorのPreview機能を使用して、iOSとAndroidの両方のレイアウトを確認します。プラットフォーム間の一貫性のために、必要に応じてデザイン要素を調整します。 |
| ペイウォールに "No available packages" というメッセージが表示される | オファリングにパッケージがないか、デフォルトのオファリングが設定されていません。 | RevenueCatダッシュボード → Product Catalog → Offeringsでオファリングにパッケージが紐付けられているか確認します。これをデフォルトのオファリングとして設定します(Actions → Make Default)。商品が承認済み(iOS)またはアクティブ(Android)の状態であるか確認します。 コミュニティの議論を参照してください。 |
| "Subscription options are not available at the moment" | Current Offeringが設定されていないか、オファリングにパッケージがありません。 | RevenueCatダッシュボード → Product Catalog → Offeringsで1つのオファリングがCurrentとして表示されているか確認します。商品が紐付けられたパッケージが少なくとも1つあるか確認します。下記の詳細ガイドを参照してください。 |
| "Subscription options are not available at the moment" | ストア商品が正しい状態ではありません。 | iOSでは、商品がApp Store ConnectでReady to SubmitまたはApprovedの状態である必要があります。Androidでは、商品がActiveの状態(Draftではない)である必要があり、アプリが少なくともクローズドテストトラックに公開されている必要があります。 |
| "Subscription options are not available at the moment" | 誤ったAPIキーまたはバンドルIDの不一致です。 | プラットフォームに合った正しいAPIキーを使用しているか確認します(iOSにはiOSキー、AndroidにはAndroidキー)。アプリのバンドル識別子がRevenueCatプロジェクト設定で構成された値と一致しているか確認します。 |
| "Subscription options are not available at the moment" | 有料アプリ契約が期限切れです(iOS)。 | App Store Connect → Agreements, Tax, and BankingでPaid Applications Agreementが署名済みでアクティブな状態か確認します。契約が期限切れまたは存在しない場合、すべての商品が利用できなくなります。 |
| 購入後にPaywallViewが閉じない(iOS) | サンドボックスのトランザクションが正しく完了しません。 | 最新のRevenueCat SDKに更新します。新しいサンドボックスアカウントでテストし、デバイスを再起動します。Purchases.shared.delegateが正しく設定されているか確認します。デバッグログでトランザクション処理のエラーを確認します。 コミュニティの議論を参照してください。 |
| RevenueCatUI.PaywallError 2 | ダッシュボードでデフォルトのオファリングが設定されていません。 | RevenueCatダッシュボードでオファリングを選択し、Actionsの3点アイコン → Make Defaultをクリックします。オファリングに商品を含む有効なパッケージがあるか確認します。ペイウォールを再公開します。 コミュニティの議論を参照してください。 |
| ペイウォールが存在しないパッケージを参照している | ペイウォールテンプレートがオファリングにないパッケージ(例:$rc_annual)を使用しています。 |
ダッシュボードで欠落しているパッケージをオファリングに追加するか、ペイウォールのデザインから該当するパッケージコンポーネントを削除します。AndroidはiOSよりもこのルールを厳格に適用します。 コミュニティの議論を参照してください。 |
ペイウォールトラブルシューティングのクイックチェックリスト
- RevenueCatUI依存関係を追加しました。
- ペイウォールを公開しました(下書きではない)。
- ペイウォールをオファリングに紐付けました。
- ペイウォールとオファリングの間でパッケージ識別子が一致しています。
- 商品を取得できます(offerings APIでテスト済み)。
- ユーザーのロケールに合った商品のローカライズを設定しました。
- 購入完了コールバックを実装しました。
- トランザクションの自動完了を有効にしました。
- デバッグロギングを有効にしました。
- 有効なストア設定でテストしています。
"Subscription options are not available at the moment"
このエラーは、SDKがペイウォールに表示する購入可能な商品を1つも取得できないときに表示されます。完全なメッセージは次のとおりです。"Subscription options are not available at the moment. Please check your RevenueCat configuration."
根本原因(可能性が高い順)
- Current Offeringが設定されていない:RevenueCatダッシュボード → Product Catalog → Offeringsに移動します。1つのオファリングがCurrentとして表示されているか確認します。currentに設定されたオファリングがないと、SDKが空のオファリングを返し、ペイウォールが商品をレンダリングできません。
- オファリングにパッケージや商品がない:オファリングは存在しますが、紐付けられたパッケージがないか、パッケージにストア商品が紐付けられていません。オファリングを開き、各パッケージに有効な商品識別子があるか確認します。
- ストア商品が利用できない:
- iOS:商品がApp Store Connectで"Ready to Submit"または"Approved"の状態である必要があります。"Missing Metadata" や "In Review" の状態の商品は取得できません。
- Android:商品がGoogle Play ConsoleでActiveの状態(Draftではない)である必要があります。アプリが少なくともクローズドテストトラックに公開されている必要があります。
- 誤ったAPIキーまたはバンドルIDの不一致:プラットフォームに合った正しい公開APIキーを使用しているか確認します(iOSにはiOSキー、AndroidにはAndroidキー)。誤ったプロジェクトや誤ったプラットフォームのキーを使用するのはよくあるミスです。アプリのバンドル識別子がRevenueCatで構成された値と正確に一致しているかも確認します。
- 有料アプリ契約の期限切れ(iOS):App Store Connect → Agreements, Tax, and BankingでPaid Applications Agreementが署名済みでアクティブな状態か確認します。契約が期限切れになると、すべての商品が利用できなくなります。
- 伝播の遅延:App Store Connectの新しい商品は、伝播に最大24~48時間かかることがあります。Google Playの商品は通常もっと速いですが、初回のアクティブ化後、数時間かかることがあります。
- テストアカウントの未設定:
- iOS:デバイスでサンドボックスのApple IDにログインしている必要があります(Settings → App Store → Sandbox Account)。シミュレータではStoreKit Configurationファイルが必要です。
- Android:テストデバイスのGoogleアカウントがGoogle Play Console → Settings → License testingでライセンステスターとして追加されている必要があります。
デバッグ手順
- デバッグロギングを有効にします。
Purchases.logLevel = .debug(iOS)またはPurchases.logLevel = LogLevel.DEBUG(Android)を使用します。 - ログ出力で
"Offerings"を探します。サーバーが正確に何を返したか、そしてストアから商品を取得できたかが表示されます。 - RevenueCatダッシュボード → Customersページで
app_user_idを確認し、顧客プロフィールが存在するか確認します。 - REST APIを通じてオファリングの取得を直接テストし、問題がサーバー側かクライアント側かを切り分けます。
ヒント:デバッグログに
"No products found in store"が表示されるのに、ダッシュボードの設定が正しく見える場合、問題はほとんどの場合、RevenueCatの設定ではなく、ストア商品の利用可否やテストアカウントの設定に関連しています。