くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

RevenueCat入門 その9 | 表示する課金アイテムの取得

前回の続き。ついに課金アイテムの表示まわりに(*´ω`*)

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の話なので有料機能。

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)を取得/参照するのはこんな感じ。
storeProductrcBillingProductでもアクセスできるらしい

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を組み合わせると、より簡単に購入画面がつくれそう(*´ω`*)


以上!! OfferingsとSDKの関係がわかってきたぞ。。(*´ω`*)