前回の続き。ついに課金アイテムの表示まわりに(*´ω`*)
Displaying Products
設定したOfferingsを表示する話。
Fetching Offerings
課金アイテムの取得はこんな感じ。
初期化時に自動で取得するため、ほとんどの場合は使わないっぽい。
try { Offerings offerings = await Purchases.getOfferings(); if (offerings.current != null && offerings.current.availablePackages.isNotEmpty) { // Display packages for sale } } on PlatformException catch (e) { // optional error handling }
もしOfferingsが空の場合は、各ストアの問題のよう。
- iOS/App Store Connect
- 「Paid Applications Agreement」の期限切れ
- 「提出準備完了」ではない
- Android/Play Console
- 非公開のトラック
- 有効なテストユーザが存在しない
Fetching Offerings by Placement
複数のpaywallがあり、各箇所を一意に制御したい場合は、
placementを指定する。
Offering offering = await Purcharses.getCurrentOfferingForPlacement( "your-placement-identifier", );
Placementの話はこのあたり。Targetingの話なので有料機能。
- Targeting | In-App Subscriptions Made Easy – RevenueCat
- By Placement | In-App Subscriptions Made Easy – RevenueCat
Custom Offering identifiers
特定のOfferingを取得する場合は、直接IDを指定すればOK。
try { Offerings offerings = await Purchases.getOfferings(); if (offerings.getOffering("experiment_group").availablePackages.isNotEmpty) { // Display packages for sale } } on PlatformException catch (e) { // optional error handling }
Displaying Packages
Packagesを表示する方法。
取得したPacakgeの情報は以下の感じ。
- Identifier
- PackageのID
- Type
MONTHLY
/ANNUAL
など
- Product
- 実際の課金アイテム
- 価格や期間などの詳細
取得方法はこんな感じで、いくつかある
// availablePackagesを使う offerings.getOffering("experiment_group").availablePackages // duration(期間)を使う offerings.getOffering("experiment_group").monthly // packageIdを使う offerings.getOffering("experiment_group").getPackage("<package_id>")
Getting the Product from the Package
Package内の課金アイテム(Product)を取得/参照するのはこんな感じ。
storeProduct
やrcBillingProduct
でもアクセスできるらしい
try { Offerings offerings = await Purchases.getOfferings(); if (offerings.current != null && offerings.current.monthly != null) { Product product = offerings.current.monthly.product; // Get the price and introductory period from the Product } } on PlatformException catch (e) { // optional error handling }
Choosing which Offering to display
実際には、defaultのOfferingでなく、
解約前のスペシャル割引価格とか特定ユーザのセールなどもあるので、
ユーザの状態/条件によって切り替えることもできる。
try { Offerings offerings = await Purchases.getOfferings(); var packages; if (user.isPaidDownload) { packages = offerings?.getOffering("paid_download_offer")?.availablePackages; } else if (user.signedUpOver30DaysAgo) { packages = offerings?.getOffering("long_term_offer")?.availablePackages; } else if (user.recentlyChurned) { packages = offerings?.getOffering("ios_subscription_offer")?.availablePackages; } presentPaywall(packages); } on PlatformException catch (e) { // optional error handling }
Best Practices
- ✅ ハードコードをなくし、動的に切り替えれるようにする
- 特定のIDをベタ書きしない
- ✅ defaultのパッケージタイプを使う
- ハードコードが必要になるため、CUSTOMは基本使わない。
- ✅ 選択できる課金アイテムの数を制限しない
- 動的に変えられるよう数を固定しないUIにする
- ✅ 異なる期間のトライアルをサポートする
- トライアル用のテキスト文も動的にする
表示する課金アイテムを取得する方法だけなので、
UIは自前で作る必要があるよう。
管理画面でカスタマイズできるUIコンポーネントも用意されているので、
Paywallsを組み合わせると、より簡単に購入画面がつくれそう(*´ω`*)
- Paywalls | In-App Subscriptions Made Easy – RevenueCat
- purchases_ui_flutter | Flutter package
- purchases-flutter/purchases_ui_flutter at main · RevenueCat/purchases-flutter
以上!! OfferingsとSDKの関係がわかってきたぞ。。(*´ω`*)