Kotlin Multiplatform SDKでリモートコンフィグペイウォールのペイウォールとプロダクトを取得する

リモートコンフィグとカスタムペイウォールを表示する前に、それらに関する情報を取得する必要があります。このトピックはリモートコンフィグとカスタムペイウォールに関するものです。Flow Builder または Paywall Builder でカスタマイズされたフローやペイウォールの取得方法については、フローとペイウォールの取得をご覧ください。

Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演しているサンプルアプリをご覧ください。

モバイルアプリでフローとプロダクトの取得を始める前に(クリックして展開)
  1. Adapty ダッシュボードでプロダクトを作成する

  2. Adapty ダッシュボードでフローまたはペイウォールを作成し、プロダクトを組み込む

  3. Adapty ダッシュボードでプレースメントを作成し、フローまたはペイウォールをプレースメントに組み込む

  4. モバイルアプリに Adapty SDK をインストールする

フローの情報を取得する

Adapty では、プロダクトは App Store と Google Play 両方のプロダクトを組み合わせたものです。これらのクロスプラットフォームのプロダクトはフローやペイウォールに組み込まれており、モバイルアプリの特定のプレースメントでユーザーに表示できます。

プロダクトを表示するには、getFlow メソッドを使ってプレースメントのいずれかから AdaptyFlow を取得する必要があります。

プロダクトIDをハードコードしないでください。 ハードコードすべきIDはプレースメントIDのみです。フローはリモートで設定されるため、プロダクトの数や利用可能なオファーはいつでも変わる可能性があります。アプリはこれらの変更を動的に処理する必要があります。たとえば、フローが今日2つのプロダクトを返し、明日3つを返す場合でも、コードを変更せずにすべてを表示できるようにしてください。


Adapty.getFlow(
    placementId = "YOUR_PLACEMENT_ID", 
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
    loadTimeout = 5.seconds
).onSuccess { flow ->
    // the requested flow
}.onError { error ->
    // handle the error
}
パラメータ必須/任意説明
placementId必須プレースメントの識別子。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。
fetchPolicyデフォルト: AdaptyPaywallFetchPolicy.Default

デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるため、この設定を推奨します。

ただし、ユーザーのインターネット接続が不安定だと考えられる場合は、AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad を使用してキャッシュデータが存在する場合はそれを返すことを検討してください。この場合、ユーザーが受け取るデータが最新でない可能性はありますが、インターネット接続の状態にかかわらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、ネットワークリクエストを避けるためにセッション中に使用しても安全です。

キャッシュはアプリを再起動しても保持され、アプリの再インストール時または手動でクリーンアップした場合にのみ消去されます。

Adapty SDK はフローとペイウォールを 2 つの層に保存します。1 つ目は上述の定期更新キャッシュで、2 つ目はフォールバックペイウォールです。また、フローとペイウォールをより速く取得するために CDN を使用し、CDN が利用できない場合に備えてスタンドアロンのフォールバックサーバーも用意しています。このシステムは、インターネット接続が乏しい状況でも信頼性を確保しながら、常に最新バージョンのフローとペイウォールを取得できるよう設計されています。

loadTimeoutデフォルト: 5 秒

このメソッドのタイムアウトを制限する値です。タイムアウトに達した場合、キャッシュされたデータまたはローカルフォールバックが返されます。

内部では複数のリクエストで構成される場合があるため、まれに loadTimeout で指定した時間よりわずかに遅くタイムアウトすることがあります。

プロダクトIDをハードコードしないでください!フローはリモートで設定されるため、利用可能なプロダクト、プロダクト数、特別オファー(無料トライアルなど)は随時変更される可能性があります。こうしたシナリオにコードが対応できるよう注意してください。

たとえば、最初に2つのプロダクトを取得した場合、アプリはその2つを表示する必要があります。その後3つのプロダクトを取得した場合、コードを変更することなく3つすべてを表示できる必要があります。ハードコードが必要なのはプレースメントIDのみです。

レスポンスパラメーター:

パラメーター説明
FlowAdaptyFlow オブジェクト。フロー識別子、ペイウォールのバリアント(paywalls — それぞれに独自のプロダクト識別子を持つ)、設定されたロケールごとに1エントリの remoteConfigs リスト、およびその他のプロパティが含まれます。フローのプロダクトを取得するには、getPaywallProducts(flow) を呼び出してください。

v4 では、getFlowlocale パラメーターはありません。createFlowView でフローをレンダリングする際、ローカライズは自動的に解決されます。カスタムペイウォールの場合、利用可能なすべてのロケールが flow.remoteConfigs にまとめて返されます。ユーザーのデバイスまたはアプリの設定に合ったロケールを選択してください。詳細については、ローカライズとロケールコードをご覧ください。

プロダクトの取得

フローを取得したら、それに対応するプロダクト配列を照会できます:

Adapty.getPaywallProducts(flow).onSuccess { products ->
    // the requested products
}.onError { error ->
    // handle the error
}

レスポンスパラメーター:

パラメータ説明
ProductsAdaptyPaywallProduct オブジェクトのリスト。プロダクト識別子、プロダクト名、価格、通貨、サブスクリプション期間、その他のプロパティが含まれます。

独自のフロー設計を実装する場合、AdaptyPaywallProduct オブジェクトの以下のプロパティが必要になることがあります。よく使われるプロパティを以下に示しますが、利用可能なすべてのプロパティの詳細については、リンク先のドキュメントを参照してください。

プロパティ説明
Titleプロダクトのタイトルを表示するには、product.localizedTitle を使用します。ローカライズはデバイスのロケールではなく、ユーザーが選択したストアの国に基づいて行われます。
Priceローカライズされた価格を表示するには、product.price.localizedString を使用します。このローカライズはデバイスのロケール情報に基づいています。product.price.amount を使用して価格を数値として取得することもできます。値はローカル通貨で提供されます。関連する通貨記号を取得するには、product.price.currencySymbol を使用します。
Subscription Period期間(週、月、年など)を表示するには、product.subscriptionDetails?.localizedSubscriptionPeriod を使用します。このローカライズはデバイスのロケールに基づいています。サブスクリプション期間をプログラムで取得するには、product.subscriptionDetails?.subscriptionPeriod を使用します。そこから unit 列挙型にアクセスして長さ(DAY、WEEK、MONTH、YEAR、または UNKNOWN)を取得できます。numberOfUnits の値で期間の単位数を取得できます。たとえば、四半期ごとのサブスクリプションの場合、unit プロパティには MONTH、numberOfUnits プロパティには 3 が表示されます。
Introductory Offerサブスクリプションに初回オファーが含まれているかどうかを示すバッジやその他のインジケーターを表示するには、product.subscriptionDetails?.introductoryOfferPhases プロパティを確認してください。これは最大2つの割引フェーズ(無料トライアルフェーズと初回価格フェーズ)を含むリストです。各フェーズオブジェクトには以下の便利なプロパティが含まれています:
paymentModeFREE_TRIALPAY_AS_YOU_GOPAY_UPFRONTUNKNOWN の値を持つ列挙型。無料トライアルは FREE_TRIAL タイプになります。
price:割引価格を数値で表したもの。無料トライアルの場合は 0 を確認してください。
localizedNumberOfPeriods:オファーの期間をデバイスのロケールでローカライズして説明する文字列。たとえば、3日間のトライアルオファーの場合、このフィールドには 3 days と表示されます。
subscriptionPeriod:このプロパティを使用して、オファー期間の個別の詳細を取得することもできます。オファーに対しても前のセクションで説明したのと同様の方法で機能します。
localizedSubscriptionPeriod:ユーザーのロケールに合わせてフォーマットされた割引のサブスクリプション期間。

デフォルトオーディエンスのフローでフロー取得を高速化する

通常、フローはほぼ瞬時に取得されるため、この処理の高速化を気にする必要はありません。ただし、オーディエンスやプレースメントが多数あり、ユーザーのインターネット接続が不安定な場合、フローの取得に予想以上の時間がかかることがあります。そのような状況では、何も表示しないよりもデフォルトのフローを表示することで、スムーズなユーザー体験を確保したい場合があるでしょう。

これに対処するには、getFlowForDefaultAudience メソッドを使用できます。このメソッドは、指定されたプレースメントの All Users オーディエンス向けフローを取得します。ただし、推奨されるアプローチは getFlow メソッドでフローを取得することである点を理解しておくことが重要です。詳細は上記のフロー情報の取得セクションをご覧ください。

getFlow を推奨する理由

getFlowForDefaultAudience メソッドにはいくつかの重大な欠点があります:

  • 後方互換性の問題: 現在のバージョンと将来のバージョンで異なるフローを表示する必要がある場合、課題が生じる可能性があります。現在の(レガシー)バージョン向けにフローを設計するか、現在の(レガシー)バージョンのユーザーがレンダリングされないフローで問題に遭遇することを許容するかを選択する必要があります。
  • ターゲティングの喪失: すべてのユーザーが All Users オーディエンス向けに設計された同じフローを見ることになるため、パーソナライズされたターゲティング(国、マーケティングアトリビューション、独自のカスタム属性に基づくものを含む)が失われます。

デフォルトオーディエンス向けのフロー取得を高速化するメリットが上記のデメリットを上回ると判断した場合は、以下のように getFlowForDefaultAudience メソッドを使用してください。そうでない場合は、上記で説明した getFlow を引き続き使用してください。


Adapty.getFlowForDefaultAudience(
    placementId = "YOUR_PLACEMENT_ID",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default
).onSuccess { flow ->
    // the requested flow
}.onError { error ->
    // handle the error
}
パラメータ必須/任意説明
placementId必須プレースメントの識別子。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。
fetchPolicyデフォルト: AdaptyPaywallFetchPolicy.Default

デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方法を推奨します。ユーザーが常に最新のデータを受け取れるためです。

ただし、ユーザーのインターネット接続が不安定な場合は、AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad の使用を検討してください。キャッシュが存在する場合はキャッシュを返します。この場合、最新データが届かないことがありますが、接続状況に関わらず読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避ける目的で使用しても問題ありません。

キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリーンアップ時にのみ消去されます。

リモートコンフィグとカスタムペイウォールを紹介する前に、それらの情報を取得する必要があります。このトピックはリモートコンフィグとカスタムペイウォールに関するものです。ペイウォールビルダーでカスタマイズされたペイウォールの取得方法については、ペイウォールビルダーのペイウォールと設定を取得するを参照してください。

Adapty SDK がモバイルアプリにどのように統合されているか、実際の例を見てみませんか?ペイウォールの表示、購入処理、その他の基本機能を含む完全なセットアップを実演しているサンプルアプリをご覧ください。

モバイルアプリでペイウォールとプロダクトの取得を始める前に(クリックして展開)
  1. Adapty ダッシュボードでプロダクトを作成する

  2. ペイウォールを作成し、プロダクトをペイウォールに組み込む(Adapty ダッシュボード)。

  3. プレースメントを作成し、ペイウォールをプレースメントに組み込む(Adapty ダッシュボード)。

  4. Adapty SDK をインストールする(モバイルアプリ)。

ペイウォール情報の取得

Adapty では、プロダクトは App Store と Google Play 両方のプロダクトを組み合わせたものです。これらのクロスプラットフォームプロダクトはペイウォールに統合され、モバイルアプリの特定のプレースメントで表示できるようになります。

プロダクトを表示するには、getPaywall メソッドを使ってプレースメントからペイウォールを取得する必要があります。

プロダクト ID をハードコードしないでください。 ハードコードすべき ID はプレースメント ID のみです。ペイウォールはリモートで設定されるため、プロダクト数や利用可能なオファーはいつでも変更される可能性があります。アプリはこれらの変更を動的に処理する必要があります。今日ペイウォールが 2 つのプロダクトを返し、明日 3 つを返す場合でも、コードを変更せずにすべてを表示できるようにしてください。


Adapty.getPaywall(
    placementId = "YOUR_PLACEMENT_ID", 
    locale = "en",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default,
    loadTimeout = 5.seconds
).onSuccess { paywall ->
    // the requested paywall
}.onError { error ->
    // handle the error
}
パラメータ必須/任意説明
placementId必須プレースメントの識別子。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。
locale

任意

デフォルト: en

ペイウォールのローカライズの識別子。マイナス(-)文字で区切られた1つ以上のサブタグで構成される言語コードを指定します。最初のサブタグは言語、2番目は地域を表します。

例:en は英語、pt-br はブラジルポルトガル語を表します。

fetchPolicyデフォルト: AdaptyPaywallFetchPolicy.Default

デフォルトでは、SDK はサーバーからデータを読み込もうとし、失敗した場合はキャッシュされたデータを返します。この方法を推奨します。ユーザーが常に最新のデータを取得できるためです。

ただし、ユーザーのインターネット接続が不安定な場合は、AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad を使用してキャッシュデータが存在する場合にそれを返すことを検討してください。この場合、ユーザーが最新のデータを取得できないことがありますが、接続状況に関わらず読み込み時間が短縮されます。キャッシュは定期的に更新されるため、セッション中のネットワークリクエストを避けるために安全に使用できます。

キャッシュはアプリを再起動しても保持され、アプリの再インストールまたは手動でのクリーンアップ時のみクリアされます。

Adapty SDK はペイウォールを2つの層に保存します。上記の定期的に更新されるキャッシュとフォールバックペイウォールです。また、ペイウォールをより高速に取得するためにCDNを使用し、CDNに到達できない場合に備えたスタンドアロンのフォールバックサーバーも使用します。このシステムは、インターネット接続が不安定な場合でも信頼性を確保しつつ、常に最新バージョンのペイウォールを取得できるよう設計されています。

loadTimeoutデフォルト: 5秒

このメソッドのタイムアウト上限を設定します。タイムアウトに達した場合、キャッシュされたデータまたはローカルのフォールバックが返されます。

内部的に複数のリクエストで構成される場合があるため、まれに loadTimeout で指定した時間よりもわずかに遅れてタイムアウトすることがあります。

プロダクトIDをハードコードしないでください!ペイウォールはリモートで設定されるため、利用可能なプロダクト、プロダクトの数、特別オファー(無料トライアルなど)は随時変更される可能性があります。こうしたシナリオにコードで対応できるようにしてください。

例えば、最初に2つのプロダクトを取得した場合、アプリはその2つを表示する必要があります。後で3つのプロダクトを取得した場合は、コードを変更することなく3つすべてを表示できる必要があります。ハードコードする必要があるのはプレースメントIDだけです。

レスポンスパラメーター:

パラメータ説明
PaywallプロダクトIDのリスト、ペイウォールの識別子、リモートコンフィグ、その他のプロパティを持つ AdaptyPaywall オブジェクト。

プロダクトの取得

ペイウォールを取得したら、それに対応するプロダクトの配列を取得できます:

Adapty.getPaywallProducts(paywall).onSuccess { products ->
    // the requested products
}.onError { error ->
    // handle the error
}

レスポンスパラメーター:

パラメーター説明
Productsプロダクト識別子、プロダクト名、価格、通貨、サブスクリプション期間、その他のプロパティを含む AdaptyPaywallProduct オブジェクトのリスト。

独自のペイウォールデザインを実装する際、AdaptyPaywallProduct オブジェクトから以下のプロパティを参照することになるでしょう。よく使われるプロパティを以下に示しますが、利用可能なすべてのプロパティの詳細については、リンク先のドキュメントを参照してください。

プロパティ説明
Titleプロダクトのタイトルを表示するには、product.localizedTitle を使用します。ローカライズはデバイスのロケールではなく、ユーザーが選択したストアの国に基づいて行われます。
Priceローカライズされた価格を表示するには、product.price.localizedString を使用します。このローカライズはデバイスのロケール情報に基づきます。product.price.amount を使用すると、価格を数値として取得することもできます。値はローカル通貨で提供されます。対応する通貨記号を取得するには、product.price.currencySymbol を使用します。
Subscription Period期間(週、月、年など)を表示するには、product.subscriptionDetails?.localizedSubscriptionPeriod を使用します。このローカライズはデバイスのロケールに基づきます。プログラムでサブスクリプション期間を取得するには、product.subscriptionDetails?.subscriptionPeriod を使用します。unit 列挙型から期間の長さ(DAY、WEEK、MONTH、YEAR、または UNKNOWN)を取得できます。numberOfUnits の値は期間の単位数を返します。例えば、四半期サブスクリプションの場合、unit プロパティには MONTH、numberOfUnits プロパティには 3 が表示されます。
Introductory Offerサブスクリプションに初回オファーが含まれているかどうかをバッジなどで表示するには、product.subscriptionDetails?.introductoryOfferPhases プロパティを確認します。これは最大2つの割引フェーズ(無料トライアルフェーズと初回価格フェーズ)を含むリストです。各フェーズオブジェクトには以下のプロパティが含まれます:
paymentModeFREE_TRIALPAY_AS_YOU_GOPAY_UPFRONTUNKNOWN の値を持つ列挙型。無料トライアルは FREE_TRIAL タイプになります。
price:数値としての割引価格。無料トライアルの場合は 0 になります。
localizedNumberOfPeriods:オファーの期間をデバイスのロケールでローカライズした文字列。例えば、3日間のトライアルオファーの場合、このフィールドには 3 days と表示されます。
subscriptionPeriod:オファー期間の詳細を個別に取得するには、このプロパティを使用します。前のセクションで説明したサブスクリプション期間と同様の動作をします。
localizedSubscriptionPeriod:ユーザーのロケールに合わせてフォーマットされた割引のサブスクリプション期間。

デフォルトオーディエンスのペイウォールでペイウォールの取得を高速化する

通常、ペイウォールはほぼ瞬時に取得されるため、このプロセスを高速化することを気にする必要はありません。ただし、オーディエンスやペイウォールの数が多く、ユーザーのインターネット接続が不安定な場合、ペイウォールの取得に予想以上の時間がかかることがあります。そのような状況では、ペイウォールをまったく表示しないよりも、デフォルトのペイウォールを表示してスムーズなユーザー体験を提供したいと思うかもしれません。

これに対処するには、getPaywallForDefaultAudience メソッドを使用できます。このメソッドは、指定されたプレースメントの All Users オーディエンス向けペイウォールを取得します。ただし、推奨されるアプローチは getPaywall メソッドでペイウォールを取得することである点を理解しておくことが重要です。詳細は上記のペイウォール情報の取得セクションをご覧ください。

getPaywall を推奨する理由

getPaywallForDefaultAudience メソッドにはいくつかの重大な欠点があります:

  • 後方互換性の問題: 現在のバージョンと将来のバージョンで異なるペイウォールを表示する必要がある場合、課題が生じる可能性があります。現在の(レガシー)バージョンに対応したペイウォールを設計するか、現在の(レガシー)バージョンのユーザーがペイウォールの未レンダリングに関する問題に遭遇することを許容するか、どちらかを選ぶ必要があります。
  • ターゲティングの喪失: すべてのユーザーが All Users オーディエンス向けに設計された同じペイウォールを見ることになり、国、マーケティングのアトリビューション、独自のカスタム属性に基づくパーソナライズされたターゲティングが失われます。

デフォルトオーディエンス向けのペイウォール取得を高速化するメリットを優先したい場合は、以下のように getPaywallForDefaultAudience メソッドを使用してください。そうでない場合は、上記で説明した getPaywall を引き続き使用してください。


Adapty.getPaywallForDefaultAudience(
    placementId = "YOUR_PLACEMENT_ID",
    locale = "en",
    fetchPolicy = AdaptyPaywallFetchPolicy.Default
).onSuccess { paywall ->
    // the requested paywall
}.onError { error ->
    // handle the error
}
パラメータ必須/任意説明
placementId必須プレースメントの識別子。Adapty ダッシュボードでプレースメントを作成した際に指定した値です。
locale

任意

デフォルト: en

ペイウォールのローカライズの識別子。このパラメータはマイナス(-)文字で区切られた1つ以上のサブタグで構成された言語コードである必要があります。最初のサブタグは言語、2番目のサブタグは地域を表します。

例: en は英語、pt-br はブラジルポルトガル語を表します。

fetchPolicyデフォルト: AdaptyPaywallFetchPolicy.Default

デフォルトでは、SDK はサーバーからデータの読み込みを試み、失敗した場合はキャッシュされたデータを返します。ユーザーが常に最新のデータを受け取れるため、この設定を推奨します。

ただし、ユーザーのインターネット接続が不安定な場合は、AdaptyPaywallFetchPolicy.ReturnCacheDataElseLoad を使用してキャッシュデータが存在する場合にそれを返すことを検討してください。この場合、ユーザーは最新のデータを取得できないことがありますが、インターネット接続の状態に関わらず、より速い読み込みを体験できます。キャッシュは定期的に更新されるため、ネットワークリクエストを減らすためにセッション中に使用しても安全です。

キャッシュはアプリを再起動しても保持され、アプリの再インストールや手動でのクリーンアップによってのみ削除されます。