Flutter SDKでのフローとペイウォールの取得を最適化する

Flutter でフローやペイウォールを確実に取得するには、次の3つが必要です:高速なレンダリング、オーディエンス対象のバリアントの返却、そしてネットワークが遅い場合のグレースフルなフォールバック。以下のルールでは、それを実現するためのタイミング・キャッシング・フォールバックパターンについて説明します。

Tip

このルールは、Adapty().activate() と Adapty().identify() がすでに完了していることを前提としています。詳細は Flutter SDK の呼び出し順序 を参照してください。

ルールと注意点

これをすることこれをしないこと理由
表示しようとしているプレースメントをフェッチする。起動時にすべてのプレースメントを一括でプリフェッチする。一括プリフェッチはメインスレッドをブロックし、バースト中にブラックスクリーンが発生する。
アトリビューションが解決する機会を得た後に getFlow をフェッチする — 例えば、activate の 1〜2 秒後、または didUpdateProfileStream が発火した後。runApp の前に main() で getFlow を呼び出す。アトリビューションがまだ反映されていない。フローはデフォルトのオーディエンスに対して解決され、セグメントや ASA パーソナライゼーションが暗黙的にスキップされる。
loadTimeout を設定し、すべてのプレースメントにフォールバックペイウォールを設定する。getFlow を無制限に待機する。タイムアウトがないと、通信状態が悪いユーザーはネットワークが解決するまで — またはアプリを閉じるまで — 空白の画面を見続けることになる。

プレースメントの選び方についてはプレースメントを、fetchPolicyおよびloadTimeoutパラメータの詳細についてはペイウォールとプロダクトの取得を参照してください。

アプリバンドルから最初の画面のメディアを表示する

フローは画像や動画を Adapty からダウンロードします。最初の画面のメディアを即座に表示するには、アプリバンドルから直接提供してください。これは、既存のネイティブオンボーディングのビジュアルなど、すでに同梱しているメディアを再利用するのに便利な方法です。

  1. Flow & Paywall Builderで、画像または動画にカスタムメディアIDを設定します。そこでアップロードしたファイルはフォールバックとして使用されます。
  2. ファイルをFlutterのアセットに追加し、pubspec.yamlのassetsに記載します。
  3. フロービューを作成する際に、customAssetsでそのIDに対応するバンドルファイルを渡します。
// "welcome_video" は Flow & Paywall Builder で設定したカスタムメディア ID です
final bundledAssets = {
  'welcome_video': AdaptyCustomAsset.localVideoAsset(
    assetId: 'assets/videos/welcome.mp4',
  ),
};

try {
  final view = await AdaptyUI().createFlowView(
    flow: flow,
    customAssets: bundledAssets,
  );
} on AdaptyError catch (e) {
  // handle the error
}

バンドルしたファイルはアプリのダウンロードサイズに影響するため、ユーザーが最初に目にするメディアのみをバンドルしてください。

バンドルされていないメディアも即座に表示されます。フローのレイアウトには各画像の低解像度コピー(動画のスチルフレームを含む)が含まれており、フルファイルが読み込まれるまでの間、それが表示されます。

customAssets の完全なリファレンスについては、アセットのカスタマイズを参照してください。

接続状況が悪い環境向けのチューニング

接続状況が常に悪い市場(農村部、交通機関、ルーティングの問題が発生する地域)向けの設定:

  • 最初のフェッチ以外はすべて fetchPolicy: AdaptyFlowFetchPolicy.returnCacheDataElseLoad を設定する。
  • Adapty ダッシュボードのすべてのプレースメントにフォールバックペイウォールを設定する。
  • loadTimeout を 3〜5 秒に設定し、タイムアウトが発生した場合はフォールバックを受け入れる。
  • getProfile() の完了をフロー表示の条件にしない。getFlow は独立して呼び出すことで、プロファイルの取得が遅くても UI をブロックしないようにする。