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

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

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つを返す場合でも、コードを変更せずにすべてを表示できなければなりません。

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

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

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

3つ目のポリシーである .returnCacheDataIfNotExpiredElseLoad(maxAge:) は、上記2つの中間に位置します。キャッシュのコピーが maxAge 秒より新しい間はキャッシュを最初に読み取り、古くなった場合はサーバーにアクセスします。

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

Adapty SDK はフローとペイウォールを2つのレイヤーで保存します。上記の定期更新されるキャッシュとフォールバックペイウォールです。また、フローとペイウォールをより高速に取得するためにCDNを使用し、CDNにアクセスできない場合に備えてスタンドアロンのフォールバックサーバーも使用しています。

loadTimeoutデフォルト: 5秒

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

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

Note

v4 では、locale パラメータは getFlow から getFlowConfiguration(AdaptyUI でレンダリングする場合のみ使用)に移動しました。カスタムペイウォールの場合、利用可能なすべてのロケールは flow.remoteConfigs にまとめて返されます。ユーザーのデバイスまたはアプリの設定に合ったロケールを選択してください。

Tip

ユーザーがフローを必要とする前にキャッシュを埋めるには、preloadFlows(iOS SDK 4.1+)を使って複数のプレースメントを一度にプリロードしてください。プリロード済みのコピーをネットワークより優先して読み込むには、fetchPolicy: .returnCacheDataElseLoad を渡してください。

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

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

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

パラメーター説明
Flowプレースメント、識別子(id、variationId)、バリアント名(variationName、省略可能、SDK 4.2+)、名前、ペイウォールバリアント(paywalls)、設定済みロケールごとに1エントリのremoteConfigs配列、およびhasViewConfigurationフラグを含むAdaptyFlowオブジェクト。フローのプロダクトを取得するには、getPaywallProducts(flow:)を呼び出してください。

プロダクトを取得する

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

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

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

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

プロパティ説明
Titleプロダクト名を表示するには、product.localizedTitle を使用してください。ローカライズはデバイスのロケールではなく、ユーザーが選択したストアの国に基づいて行われます。
Priceローカライズされた価格を表示するには、product.localizedPrice を使用してください。このローカライズはデバイスのロケール情報に基づきます。また、product.price で価格を数値として取得することもできます。値は現地通貨で提供されます。対応する通貨記号を取得するには、product.currencySymbol を使用してください。
Subscription Period期間(例:週、月、年など)を表示するには、product.localizedSubscriptionPeriod を使用してください。このローカライズはデバイスのロケールに基づきます。サブスクリプション期間をプログラムで取得するには、product.subscriptionPeriod を使用してください。そこから unit 列挙型にアクセスして長さ(day、week、month、year、または unknown)を取得できます。numberOfUnits の値で期間単位の数を取得できます。たとえば、四半期サブスクリプションの場合、unit プロパティには .month、numberOfUnits プロパティには 3 が設定されます。
Introductory Offerサブスクリプションに初回オファーが含まれているかどうかをバッジやインジケーターで表示するには、product.subscriptionOffer プロパティを確認してください。このオブジェクトには以下のプロパティが含まれています:
• offerType:オファーの種類。定義済みの値は introductory、promotional、winBack です(SDK 4.1 以降ではエンディングではなくオープン構造体になっているため、switch 文には default ブランチが必要です)。無料トライアルや初期割引サブスクリプションは introductory タイプになります。
• price:数値としての割引価格。無料トライアルの場合は 0 になります。
• localizedPrice:ユーザーのロケールに合わせてフォーマットされた割引価格。
• localizedNumberOfPeriods:デバイスのロケールを使用してローカライズされた文字列で、オファーの期間を表します。例えば、3日間のトライアルオファーの場合、このフィールドには 3 days と表示されます。
• subscriptionPeriod:オファー期間の個別の詳細を取得するには、このプロパティを使用します。オファーに対しても前のセクションで説明したのと同じ方法で機能します。
• localizedSubscriptionPeriod:ユーザーのロケールに合わせてフォーマットされた割引のサブスクリプション期間。
Note

v4では、getPaywallProducts(flow:) が返すすべてのプロダクトにオファーの適格性情報が含まれています。v3にあった getPaywallProductsWithoutDeterminingOffer の個別呼び出しは削除されました。

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

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

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

Warning

getFlow の使用を推奨する理由

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

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

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

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

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

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

3つ目のポリシーである .returnCacheDataIfNotExpiredElseLoad(maxAge:) は、両者の中間に位置します。キャッシュのコピーが maxAge 秒より新しい間はキャッシュを最初に読み込み、古くなるとサーバーにアクセスします。

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

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

Tip

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

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

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

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

  4. モバイルアプリに Adapty SDK をインストールしてください。

ペイウォール情報の取得

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

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

Important

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

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

任意

デフォルト: en

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

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

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

fetchPolicyデフォルト: .reloadRevalidatingCacheData

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

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

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

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

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

loadTimeoutデフォルト: 5秒

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

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

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

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

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

パラメータ説明
PaywallAdaptyPaywall オブジェクト。プロダクト ID のリスト、ペイウォール識別子、リモートコンフィグ、その他いくつかのプロパティを含みます。

プロダクトを取得する

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

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

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

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

プロパティ説明
Titleプロダクトのタイトルを表示するには、product.localizedTitle を使用します。ローカライズはデバイスのロケールではなく、ユーザーが選択したストアの国に基づいています。
Price価格のローカライズされたバージョンを表示するには、product.localizedPrice を使用します。このローカライズはデバイスのロケール情報に基づいています。product.price を使って数値として価格にアクセスすることもできます。値はローカル通貨で提供されます。関連する通貨記号を取得するには、product.currencySymbol を使用します。
Subscription Period期間(週、月、年など)を表示するには、product.localizedSubscriptionPeriod を使用します。このローカライズはデバイスのロケールに基づいています。プログラムでサブスクリプション期間を取得するには、product.subscriptionPeriod を使用します。そこから unit 列挙型にアクセスして長さ(day、week、month、year、または unknown)を取得できます。numberOfUnits の値で期間の単位数を取得できます。たとえば、四半期サブスクリプションの場合、unit プロパティに .month、numberOfUnits プロパティに 3 が表示されます。
Introductory Offerサブスクリプションに初回オファーが含まれていることを示すバッジやその他のインジケーターを表示するには、product.subscriptionOffer プロパティを確認します。このオブジェクトには以下の便利なプロパティが含まれています:
• offerType:オファーの種類。定義済みの値は introductory、promotional、winBack です(SDK 4.1 以降では enum ではなくオープン構造体になっているため、switch には default ブランチが必要です)。無料トライアルや最初の割引サブスクリプションは introductory タイプになります。
• price:数値としての割引価格。無料トライアルの場合は 0 を確認してください。
• localizedPrice:ユーザーのロケール向けにフォーマットされた割引価格。
• localizedNumberOfPeriods:オファーの期間をデバイスのロケールでローカライズした文字列。たとえば、3 日間のトライアルオファーの場合、このフィールドに 3 days と表示されます。
• subscriptionPeriod:このプロパティを使ってオファー期間の個別の詳細を取得することもできます。オファーに対しても前のセクションで説明した方法と同じように機能します。
• localizedSubscriptionPeriod:ユーザーのロケール向けにフォーマットされた割引のサブスクリプション期間。

iOS での初回オファー適格性の確認

デフォルトでは、getPaywallProducts メソッドが初回オファー、プロモーションオファー、ウィンバックオファーの適格性を確認します。SDK がオファーの適格性を判定する前にプロダクトを表示する必要がある場合は、代わりに getPaywallProductsWithoutDeterminingOffer メソッドを使用してください。

Note

初期プロダクトを表示した後は、必ず通常の getPaywallProducts メソッドを呼び出して、正確なオファー適格性情報でプロダクトを更新してください。

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

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

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

Warning

getPaywall を推奨する理由

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

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

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

Note

getPaywallForDefaultAudience メソッドは iOS SDK バージョン 2.11.2 以降で利用できます。

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

任意

デフォルト: en

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

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

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

fetchPolicyデフォルト: .reloadRevalidatingCacheData

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

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

3番目のポリシー .returnCacheDataIfNotExpiredElseLoad(maxAge:) は、両者の中間に位置します。キャッシュのコピーが maxAge 秒より新しい場合はキャッシュを先に読み込み、古くなった場合はサーバーにアクセスします。

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