Kotlin Multiplatform SDKのカスタムペイウォールで購入機能を有効にする

このガイドでは、カスタムペイウォールへのAdaptyの統合方法について説明します。ペイウォールの実装を完全に制御しながら、Adapty SDKがプロダクトの取得、新規購入の処理、および以前の購入の復元を行います。このガイドはAdapty Kotlin Multiplatform SDK v4(ベータ版)APIを使用しています。v3をお使いの場合は、対応するメソッド名については移行ガイドを参照してください。

このガイドは、カスタムペイウォールを実装する開発者向けです。 購入機能を最も簡単に有効にしたい場合は、Adapty Flow Builderをご利用ください。Flow Builder を使えば、ノーコードのビジュアルエディターでフローを作成でき、購入ロジックはすべて Adapty が自動的に処理します。また、アプリを再公開することなく、さまざまなデザインをテストできます。

始める前に

プロダクトを設定する

アプリ内課金を有効にするには、3つの重要な概念を理解する必要があります。

  • プロダクト – ユーザーが購入できるもの(サブスクリプション、消耗型アイテム、永続アクセス)
  • ペイウォール – どのプロダクトを提供するかを定義する設定。Adapty では、プロダクトを取得する唯一の方法がペイウォールです。この設計により、アプリのコードを変更することなく、プロダクト・価格・オファーを変更できます。SDK v4 では、プレースメントのペイウォールバリアントは flow オブジェクトによって管理されます。フローを取得してそのプロダクトを参照する形になります。
  • プレースメント – アプリ内でペイウォールを表示する場所とタイミング(mainonboardingsettings など)。ダッシュボードでプレースメントにペイウォールを設定し、コード内ではプレースメント ID を指定してリクエストします。これにより、A/B テストの実施や、ユーザーごとに異なるペイウォールの表示が簡単に行えます。

Make sure you understand these concepts even if you work with your custom paywall. Basically, they are just your way to manage the products you sell in your app.

カスタムペイウォールを実装するには、ペイウォールを作成してプレースメントに追加する必要があります。この設定によってプロダクトを取得できるようになります。ダッシュボードで何をすればよいかを理解するには、クイックスタートガイドこちらを参照してください。

ユーザーの管理

バックエンド認証の有無にかかわらず、Adapty を利用できます。

ただし、Adapty SDK は匿名ユーザーと識別済みユーザーを異なる方法で処理します。詳細を理解し、ユーザーを適切に管理するために、識別クイックスタートガイドをご覧ください。

ステップ 1. プロダクトを取得する

カスタムペイウォール用のプロダクトを取得するには、以下の手順を行います。

  1. プレースメント ID を getFlow メソッドに渡して flow オブジェクトを取得する。
  2. getPaywallProducts メソッドを使用して、このフローのプロダクト配列を取得する。

fun loadPaywall() {
    Adapty.getFlow(placementId = "YOUR_PLACEMENT_ID")
        .onSuccess { flow ->
            Adapty.getPaywallProducts(flow = flow)
                .onSuccess { products ->
                    // Use products to build your custom paywall UI
                }
                .onError { error ->
                    // Handle the error
                }
        }
        .onError { error ->
            // Handle the error
        }
}

ステップ 2. 購入を受け付ける

ユーザーがカスタムペイウォール上のプロダクトをタップしたら、選択されたプロダクトを引数に makePurchase メソッドを呼び出してください。これにより購入フローが処理され、更新されたプロファイルが返されます。


fun purchaseProduct(product: AdaptyPaywallProduct) {
    Adapty.makePurchase(product = product)
        .onSuccess { purchaseResult ->
            when (purchaseResult) {
                is AdaptyPurchaseResult.Success -> {
                    val profile = purchaseResult.profile
                    // Purchase successful, profile updated
                }
                is AdaptyPurchaseResult.UserCanceled -> {
                    // User canceled the purchase
                }
                is AdaptyPurchaseResult.Pending -> {
                    // Purchase is pending (e.g., user will pay offline with cash)
                }
            }
        }
        .onError { error ->
            // Handle the error
        }
}

ステップ 3. 購入の復元

アプリストアでは、サブスクリプションを提供するすべてのアプリに対して、ユーザーが購入を復元できる手段を設けることを求めています。

ユーザーが復元ボタンをタップしたときに restorePurchases メソッドを呼び出してください。これにより、購入履歴が Adapty と同期され、更新されたプロファイルが返されます。


fun restorePurchases() {
    Adapty.restorePurchases()
        .onSuccess { profile ->
            // Restore successful, profile updated
        }
        .onError { error ->
            // Handle the error
        }
}

ステップ 4. サブスクリプションのステータスを確認する

購入またはリストア後は、ペイウォールを表示するか有料機能を解放するかを判断するために、ユーザーのアクセスレベルを確認します。makePurchase メソッドと restorePurchases メソッドはすでに更新済みのプロファイルを返しますが、アプリ内の他の場所で現在のステータスが必要な場合は getProfile メソッドを使用してください:


fun checkPremiumAccess() {
    Adapty.getProfile()
        .onSuccess { profile ->
            val hasPremiumAccess = profile.accessLevels["premium"]?.isActive == true
            // Grant access to paid features if hasPremiumAccess is true
        }
        .onError { error ->
            // Handle the error
        }
}

サブスクリプションのステータスを確認・監視する方法(リアルタイム更新のリスニングを含む)については、サブスクリプションのステータスを確認するを参照してください。

次のステップ

ご質問やお困りのことがあれば、サポートフォーラムをご覧ください。よくある質問への回答を見つけたり、ご自身の質問を投稿することができます。チームとコミュニティがサポートいたします!

ペイウォールをアプリに表示する準備ができました。App Store サンドボックスまたはGoogle Play ストアでテスト購入を行い、ペイウォールからの購入が正常に完了することを確認してください。本番環境に近い実装例を確認するには、サンプルアプリの AppViewModel.kt をご覧ください。購入処理のエラーハンドリングや状態管理の実装方法が確認できます。