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

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

Tip

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

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

  2. Adapty ダッシュボードでペイウォールを作成し、プロダクトをペイウォールに追加します。

  3. Adapty ダッシュボードでプレースメントを作成し、ペイウォールをプレースメントに追加します。

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

フローの情報を取得する

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

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

Important

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

try {
  final flow = await Adapty().getFlow(placementId: 'YOUR_PLACEMENT_ID');
  // the requested flow
} on AdaptyError catch (adaptyError) {
  // handle the error
} catch (e) {
  // handle the error
}
パラメーター必須/任意説明
placementId必須プレースメントの識別子。Adapty ダッシュボードでプレースメントを作成した際に指定した値です。
fetchPolicyデフォルト: AdaptyFlowFetchPolicy.reloadRevalidatingCacheData

fetchPolicy は、SDKがキャッシュを使用するかどうかではなく、どのレイヤーを最初に読み込むかを設定します。デフォルトでは、SDKはまずサーバーにアクセスし、リクエストが失敗した場合にキャッシュデータを返します。ユーザーが常に最新のデータを取得できるため、この設定をお勧めします。

ただし、ユーザーがネットワーク環境の不安定な状況に置かれることが多い場合は、AdaptyFlowFetchPolicy.returnCacheDataElseLoad の使用を検討してください。この設定では読み込み順序が逆になり、まずキャッシュを読み込み、キャッシュがない場合にのみサーバーにアクセスします。最新のデータが取得できない場合もありますが、ネットワークが不安定な状況でも高速な読み込みが実現できます。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために使用しても安全です。

3つ目のポリシー AdaptyFlowFetchPolicy.returnCacheDataIfNotExpiredElseLoad(maxAge) は、上記2つの中間に位置します。指定した Duration より新しいキャッシュが存在する場合はキャッシュを優先して読み込み、古くなった場合はサーバーにアクセスします。

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

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

loadTimeoutデフォルト: 5秒

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

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

Note

v4 では、getFlow は locale パラメーターを受け取りません。カスタムペイウォールの場合、利用可能なすべてのローカライズがフローのリモートコンフィグ(flow.remoteConfigs)として返されるので、ユーザーのデバイスまたはアプリ設定に合ったものを選択してください。詳しくはローカライズとロケールコードをご覧ください。

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

パラメーター説明
Flowフローの識別子(instanceIdentity、variationId)、名前、プレースメント、ペイウォールのバリアント(paywalls)、リモートコンフィグ(remoteConfigs)を含む AdaptyFlow オブジェクト。

プロダクトの取得

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

try {
  final products = await Adapty().getPaywallProducts(flow: flow);
  // the requested products array
} on AdaptyError catch (adaptyError) {
  // handle the error
} catch (e) {
  // handle the error
}

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

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

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

プロパティ説明
Titleプロダクトのタイトルを表示するには、product.localizedTitle を使用します。なお、ローカライズはデバイスのロケールではなく、ユーザーが選択したストアの国に基づいて行われます。
Priceローカライズされた価格を表示するには、product.price.localizedString を使用します。このローカライズはデバイスのロケール情報に基づきます。product.price.amount を使用すると数値として価格を取得することもできます。値はローカル通貨で提供されます。関連する通貨記号を取得するには、product.price.currencySymbol を使用します。
Subscription Period期間(週、月、年など)を表示するには、product.subscription?.localizedPeriod を使用します。このローカライズはデバイスのロケールに基づきます。サブスクリプション期間をプログラムで取得するには、product.subscription?.period を使用します。ここから unit 列挙型にアクセスして、長さ(day、week、month、year、または unknown)を取得できます。numberOfUnits の値は期間ユニット数を返します。例えば、四半期サブスクリプションの場合、unit プロパティには AdaptyPeriodUnit.month、numberOfUnits プロパティには 3 が設定されます。
Introductory Offerサブスクリプションに初回オファーが含まれているかどうかをバッジなどで表示するには、product.subscription?.offer?.phases プロパティを確認してください。これはリストで、フリートライアルフェーズと初回価格フェーズの最大2つの割引フェーズを含めることができます。各フェーズオブジェクトには以下の便利なプロパティがあります:
• paymentMode:AdaptyPaymentMode.freeTrial、AdaptyPaymentMode.payAsYouGo、AdaptyPaymentMode.payUpFront、AdaptyPaymentMode.unknown の値を持つ列挙型です。フリートライアルは AdaptyPaymentMode.freeTrial タイプになります。
• price:割引価格を数値で表します。フリートライアルの場合は 0 になります。
• localizedNumberOfPeriods:オファーの期間をデバイスのロケールでローカライズした文字列です。例えば、3日間のトライアルオファーの場合、このフィールドには 3 days と表示されます。
• subscriptionPeriod:オファー期間の個別の詳細をこのプロパティで取得することもできます。オファーに対しても前のセクションで説明したのと同じ方法で機能します。
• localizedSubscriptionPeriod:ユーザーのロケールに合わせてフォーマットされた割引のサブスクリプション期間です。

デフォルトオーディエンスフローによるフロー取得の高速化

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

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

Warning

getFlow を推奨する理由

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

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

これらのデメリットを受け入れてフローの取得を高速化したい場合は、以下のように getFlowForDefaultAudience メソッドを使用してください。そうでない場合は、上記で説明した getFlow を引き続き使用してください。

try {
  final flow = await Adapty().getFlowForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID');
  // the requested flow
} on AdaptyError catch (adaptyError) {
  // handle error
} catch (e) {
  // handle unknown error
}
パラメータ必須/任意説明
placementId必須プレースメントの識別子。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。
fetchPolicyデフォルト: AdaptyFlowFetchPolicy.reloadRevalidatingCacheData

fetchPolicy は、SDK がまずどのレイヤーを読み取るかを設定するものであり、キャッシュを使用できるかどうかを設定するものではありません。デフォルトでは、SDK はまずサーバーにアクセスし、そのリクエストが失敗した場合にキャッシュされたデータを返します。ユーザーが常に最新のデータを取得できるため、この設定を推奨します。

ただし、ユーザーがインターネット接続の不安定な環境にいると考えられる場合は、AdaptyFlowFetchPolicy.returnCacheDataElseLoad の使用を検討してください。これは順序を逆にするもので、まずキャッシュを読み取り、何もキャッシュされていない場合にのみサーバーにアクセスします。ユーザーが最新のデータを取得できないことがありますが、インターネット接続の状況にかかわらず、読み込み時間が短縮されます。キャッシュは定期的に更新されるため、ネットワークリクエストを避けるためにセッション中に使用しても安全です。

3 番目のポリシーである AdaptyFlowFetchPolicy.returnCacheDataIfNotExpiredElseLoad(maxAge) は、両者の中間に位置します。渡した Duration よりキャッシュが新しい間はキャッシュを優先して読み取り、古くなった時点でサーバーにアクセスします。

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

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

Tip

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

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

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

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

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

ペイウォール情報の取得

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

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

Important

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

try {
  final paywall = await Adapty().getPaywall(placementId: "YOUR_PLACEMENT_ID", locale: "en");
  // the requested paywall
} on AdaptyError catch (adaptyError) {
  // handle the error
} catch (e) {
}
パラメータ必須/任意説明
placementId必須プレースメントの識別子。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。
locale

任意

デフォルト: en

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

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

ロケールコードおよび推奨される使用方法については、ローカライズとロケールコードを参照してください。

fetchPolicyデフォルト: AdaptyPaywallFetchPolicy.reloadRevalidatingCacheData

fetchPolicy は、SDK がどのレイヤーを最初に読み取るかを設定するものであり、キャッシュの使用可否を決めるものではありません。デフォルトでは、SDK はまずサーバーにアクセスし、リクエストが失敗した場合にキャッシュデータを返します。ユーザーが常に最新のデータを受け取れるため、このオプションを推奨します。

ただし、ユーザーが不安定なインターネット環境を使用していると考えられる場合は、AdaptyPaywallFetchPolicy.returnCacheDataElseLoad の使用を検討してください。これは順序を逆にして、まずキャッシュを読み取り、キャッシュが存在しない場合のみサーバーにアクセスします。ユーザーが最新のデータを取得できない場合がありますが、インターネット接続が不安定でも読み込みが速くなります。キャッシュは定期的に更新されるため、セッション中にネットワークリクエストを避けるために使用しても安全です。

3つ目のポリシー AdaptyPaywallFetchPolicy.returnCacheDataIfNotExpiredElseLoad(maxAge) は、両者の中間に位置します。指定した Duration より新しいキャッシュがある場合はまずキャッシュを読み取り、古い場合はサーバーにアクセスします。

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

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

loadTimeoutデフォルト: 5秒

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

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

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

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

レスポンスパラメータ:

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

プロダクトを取得する

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

try {
  final products = await Adapty().getPaywallProducts(paywall: paywall);
  // the requested products array
} on AdaptyError catch (adaptyError) {
  // handle the error
} catch (e) {
}

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

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

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

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

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

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

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

Warning

getPaywall を推奨する理由

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

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

これらのデメリットを受け入れてでもペイウォールの取得を高速化したい場合は、以下のように getPaywallForDefaultAudience メソッドを使用してください。そうでない場合は、上記で説明した getPaywall を使用してください。

try {
    final paywall = await Adapty().getPaywallForDefaultAudience(placementId: 'YOUR_PLACEMENT_ID');
} on AdaptyError catch (adaptyError) {
    // handle error
} catch (e) {
    // handle unknown error
}
Note

getPaywallForDefaultAudience メソッドは Flutter SDK バージョン 3.2.0 以降で利用可能です。

パラメータ必須/任意説明
placementId必須プレースメントの識別子です。Adapty ダッシュボードでプレースメントを作成する際に指定した値です。
locale

任意

デフォルト: en

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

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

ロケールコードおよびその使用方法については、ローカライズとロケールコードを参照してください。

fetchPolicyデフォルト: AdaptyPaywallFetchPolicy.reloadRevalidatingCacheData

fetchPolicy は、SDK がどのレイヤーを最初に読み込むかを設定するものであり、キャッシュの使用可否を制御するものではありません。デフォルトでは SDK はまずサーバーにアクセスし、リクエストが失敗した場合にキャッシュデータを返します。ユーザーが常に最新のデータを取得できるため、この設定を推奨します。

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

3番目のポリシー AdaptyPaywallFetchPolicy.returnCacheDataIfNotExpiredElseLoad(maxAge) は、2つの中間に位置します。指定した Duration より新しいキャッシュがある場合はキャッシュを優先して読み込み、古くなった場合はサーバーにアクセスします。

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