iOS SDKでペイウォールのフェッチを最適化する

iOSで信頼性の高いペイウォールフェッチを実現するには、3つの要件を満たす必要があります。高速なレンダリング、オーディエンスターゲットに合ったペイウォールの返却、そしてネットワークが遅い場合のグレースフルなフォールバックです。以下のルールでは、それを実現するためのタイミング、キャッシュ、フォールバックのパターンを説明します。

Tip

以下のルールは、Adapty.activate()Adapty.identify() がすでに解決済みであることを前提としています。iOS SDKのコール順序を参照してください。

ルールと注意点

実施すること実施しないこと理由
表示するプレースメントをフェッチするか、preloadFlows(SDK 4.1+)でキャッシュをウォームアップする。起動時に独自の並行 getFlow 呼び出しを展開する。自前のプリフェッチバーストはメインスレッドをブロックしてブラックスクリーンを引き起こす。preloadFlows はこの用途向けに設計されており、バッチ全体で1つのタイムアウトバジェットを共有する。
アトリビューションが解決される機会を得た後、たとえば activate の1〜2秒後や onProfileUpdate の発火後に getPaywall をフェッチする。App.init()getPaywall を呼び出す。アトリビューションがまだ到達していない。ペイウォールはデフォルトのオーディエンスに対して解決され、セグメントや ASA パーソナライゼーションが暗黙的にバイパスされる。
loadTimeout を設定し、すべてのプレースメントにフォールバックペイウォールを構成する。getPaywall を無期限に待機する。タイムアウトがないと、通信状況が悪いユーザーはネットワークが解決されるまで空白の画面を見続けるか、アプリを閉じてしまう。

fetchPolicyloadTimeout パラメーターのリファレンスについてはペイウォールとプロダクトのフェッチを、適切なプレースメントの選択についてはプレースメントを参照してください。

プレースメントの事前読み込み

Info

これらのメソッドは SDK バージョン 4.1 以降で使用できます。

preloadFlowspreloadOnboardings は、プレースメントを事前に SDK キャッシュへ読み込みます。その後、同じプレースメントに対して getFlow または getOnboarding を呼び出すと、ネットワークではなくキャッシュから解決されるため、ペイウォールが待ち時間なしに表示されます。

セッションで必要になるプレースメントがわかっているものの、すぐに表示したくない場合に使用してください。たとえば、activateidentify が完了した直後に、ユーザーがまだタップしていないボタンの背後にあるペイウォールを事前読み込みする場合などに活用できます。

パラメータ:

  • 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をブロックしないようにする。