iOS SDKでペイウォールのフェッチを最適化する
iOSで信頼性の高いペイウォールフェッチを実現するには、3つの要件を満たす必要があります。高速なレンダリング、オーディエンスターゲットに合ったペイウォールの返却、そしてネットワークが遅い場合のグレースフルなフォールバックです。以下のルールでは、それを実現するためのタイミング、キャッシュ、フォールバックのパターンを説明します。
以下のルールは、Adapty.activate() と Adapty.identify() がすでに解決済みであることを前提としています。iOS SDKのコール順序を参照してください。
ルールと注意点
| 実施すること | 実施しないこと | 理由 |
|---|---|---|
表示するプレースメントをフェッチするか、preloadFlows(SDK 4.1+)でキャッシュをウォームアップする。 | 起動時に独自の並行 getFlow 呼び出しを展開する。 | 自前のプリフェッチバーストはメインスレッドをブロックしてブラックスクリーンを引き起こす。preloadFlows はこの用途向けに設計されており、バッチ全体で1つのタイムアウトバジェットを共有する。 |
アトリビューションが解決される機会を得た後、たとえば activate の1〜2秒後や onProfileUpdate の発火後に getPaywall をフェッチする。 | App.init() で getPaywall を呼び出す。 | アトリビューションがまだ到達していない。ペイウォールはデフォルトのオーディエンスに対して解決され、セグメントや ASA パーソナライゼーションが暗黙的にバイパスされる。 |
loadTimeout を設定し、すべてのプレースメントにフォールバックペイウォールを構成する。 | getPaywall を無期限に待機する。 | タイムアウトがないと、通信状況が悪いユーザーはネットワークが解決されるまで空白の画面を見続けるか、アプリを閉じてしまう。 |
fetchPolicy と loadTimeout パラメーターのリファレンスについてはペイウォールとプロダクトのフェッチを、適切なプレースメントの選択についてはプレースメントを参照してください。
プレースメントの事前読み込み
これらのメソッドは SDK バージョン 4.1 以降で使用できます。
preloadFlows と preloadOnboardings は、プレースメントを事前に SDK キャッシュへ読み込みます。その後、同じプレースメントに対して getFlow または getOnboarding を呼び出すと、ネットワークではなくキャッシュから解決されるため、ペイウォールが待ち時間なしに表示されます。
セッションで必要になるプレースメントがわかっているものの、すぐに表示したくない場合に使用してください。たとえば、activate と identify が完了した直後に、ユーザーがまだタップしていないボタンの背後にあるペイウォールを事前読み込みする場合などに活用できます。
パラメータ:
placementIds(必須): プリロードするプレースメント。空白および重複した ID は無視されます。locale(任意、preloadOnboardingsのみ): キャッシュするオンボーディングのロケール。loadTimeout(任意): 各プレースメントごとではなく、バッチ全体のタイムアウト(秒単位)。デフォルトは 5 秒で、1 秒未満の値は 1 秒に切り上げられます。
知っておくべき動作:
- メソッドがエラーをスローするのは、すべてのプレースメントの処理を試みた後です。エラーにはプレースメントごとの失敗がまとめられており、1つのプレースメントが失敗しても他のプレースメントの処理は続行されます。
- プレースメントがタイムアウトしたり、ネットワークエラーで失敗した場合、SDKはそのプレースメントのデフォルトオーディエンスのバリアントにフォールバックします。それ以外のエラーはそのまま報告されます。
- タイムアウトが発生した時点でオーディエンスを指定したフェッチが完了していない場合でも、SDKは残りの時間内でデフォルトオーディエンスのバリアントの取得を試みます。
- プリロードはキャッシュをウォームアップするだけです。コンテンツを返すわけではないため、表示するには引き続き
getFlowまたはgetOnboardingを呼び出す必要があります。
どのプレースメントが失敗したかを確認する
スローされるエラーはバッチ全体を対象とした単一の AdaptyError で、コードは networkFailed(2002)です。個別の失敗を確認するには、プレースメント ID をキーとするディクショナリである preloadErrors プロパティを参照してください。
do {
try await Adapty.preloadFlows(placementIds: ["onboarding", "main_paywall"])
} catch {
for (placementId, placementError) in error.preloadErrors ?? [:] {
// log or retry the individual placement
}
}
preloadErrors は、プリロード呼び出し以外のエラーでは nil になります。そのため、nil は「プリロード失敗なし」ではなく「プリロード失敗ではない」として扱ってください。
オーディエンスのセグメンテーションを待たずにキャッシュをウォームアップするには、デフォルトオーディエンス用のバリアントを使用します。
try await Adapty.preloadFlowsForDefaultAudience(placementIds: ["main_paywall"])
try await Adapty.preloadOnboardingsForDefaultAudience(placementIds: ["intro"])
接続が悪い環境向けの調整
接続が安定しない市場(農村部、移動中、ルーティングの問題が多い地域)向けには:
- 最初のフェッチを除くすべてのフェッチで
fetchPolicy: .returnCacheDataElseLoadを設定する。 - Adapty ダッシュボードですべてのプレースメントにフォールバックペイウォールを設定する。
loadTimeoutを3〜5秒に設定し、タイムアウトが発生した場合はフォールバックを受け入れる。- ペイウォールの表示を
getProfile()に依存させない。getPaywallは独立して呼び出すことで、プロファイルの取得が遅くてもUIをブロックしないようにする。