Remote Config のフェッチ効率に関するベスト プラクティス

Firebase Remote Config を使用すると、アプリの動作と外観を柔軟に制御できます。これにより、アプリの機能のロールアウトやクロス プラットフォームの A/B テストなどの機能が、新しいバージョンをデプロイしたり、複数のアプリストアのアップデートをナビゲートしたりすることなく利用できるようになります。

プロトタイピング、成長中のスタートアップの運営、エンタープライズ アプリケーションの大規模な管理のいずれの場合でも、ネットワーク フェッチの量を管理することは、高速で応答性の高いユーザー エクスペリエンスを実現するうえで重要です。効率的な構成管理により、コールド スタートのレイテンシが短縮され、クライアントのデータとバッテリー使用量が節約され、不要なネットワーク オーバーヘッドが防止されます。また、ユーザーベースが急速に拡大し、将来的に使用量が増加した場合、Remote Config 統合を効率化することで、使用量を効率的に維持できます。

アプリがパラメータを取得するタイミングと、パラメータを有効にするタイミングを調整することで、クライアントサイドのネットワーク リクエスト トラフィックを大幅に削減できます。

「次のセッションのフェッチ」パターンに移行

避けるべき一般的なパターンは、アプリの起動ごとに fetchAndActivate 呼び出しを使用することです。この呼び出しは、ネットワーク経由で新しい値を取得して有効化するもので、以前に取得した値のキャッシュの有効期限が短い場合(15 分から 1 時間など)に組み合わせて使用されます。このアプローチの背後にあるメンタルモデルは、ユーザーがアプリを開くたびに、常に最新の値が取得されて適用されるというものです。(毎日のセール キャンペーンやゲームのプロモーションの実施など)すぐに更新する必要がある場合もありますが、アプリのパフォーマンスやフェッチの使用量への影響とのバランスを取ることが重要です。

このアプローチでは、キャッシュの有効期限が切れるたびに新しいネットワーク呼び出しが強制的に行われるため、1 日に何度もアプリを開くユーザーに対して大量のフェッチが生成されます。

代わりに、fetch 呼び出しと activate 呼び出しを別々に行い、最小フェッチ間隔を長くして「次のセッションのためにフェッチする」モデルを採用することを検討してください。fetch はキャッシュが無効になった場合にのみネットワーク リクエストを実行するため、最小フェッチ間隔を大きくして fetchAndActivate を使用することもできますが、2 つの呼び出しを別々に使用すると、パターンが明確になり、アプリケーション開発プロセスにおける標準的な方法として確立されます。また、個別に有効にすることで、セッション中に構成値を適用してユーザー エクスペリエンスを中断するリスクを回避できます。

このアプローチの仕組み

  • 起動時にすぐに有効にする: 前回のセッションからキャッシュに保存された構成をすぐに適用します(ネットワーク遅延は 0 ミリ秒)。
  • キャッシュの有効期間を長くしてバックグラウンドで取得する(12 時間以上または 24 時間以上など): 更新された構成を非同期でリクエストし、次のセッションのローカル キャッシュを更新します。

フェッチ量を最適化する方法

最小フェッチ間隔を長くすると、フェッチ リクエストの数が少なくなります。次のセッションの新しい値を取得し、現在のセッションのキャッシュされた値を有効にすると、検証期間が長くなり、アプリがローカル キャッシュから瞬時に読み込まれるため、ユーザー エクスペリエンスが向上します。

たとえば、minimumFetchInterval を 24 時間に設定し、ユーザーが 1 日に 5 回または 10 回アプリを開いた場合、SDK はローカル キャッシュから 2 回目から 10 回目の起動を自動的に満たし、そのユーザーの 1 日あたりのネットワーク リクエスト数を 10 回以上のフェッチから 1 回に減らします。

次の例は、Android、Apple プラットフォーム、ウェブアプリでの実装がどのようなものかを示しています。

Android

val remoteConfig = Firebase.remoteConfig

// Set a 24-hour minimum fetch interval (86,400 seconds)
val configSettings = remoteConfigSettings {
    minimumFetchIntervalInSeconds = 86400
}
remoteConfig.setConfigSettingsAsync(configSettings)

// 1. Instantly activate values cached from the LAST session
remoteConfig.activate().addOnCompleteListener {
    applyAppConfigurations()
}

// 2. Fetch new values in the background for the NEXT session
remoteConfig.fetch().addOnCompleteListener { task ->
    if (task.isSuccessful) {
        // Optional: Activate values if needed
    }
}

iOS+

let remoteConfig = RemoteConfig.remoteConfig()

// Set a 24-hour minimum fetch interval (86,400 seconds)
let settings = RemoteConfigSettings()
settings.minimumFetchInterval = 86400
remoteConfig.configSettings = settings

// 1. Instantly activate values cached from the LAST session
remoteConfig.activate { changed, error in
    guard error == nil else { return }
    DispatchQueue.main.async {
        self.applyAppConfigurations()
    }
}

// 2. Fetch new values in the background for the NEXT session
remoteConfig.fetch { status, error in
    if status == .success {
        // Optional: Activate values if needed
    }
}

ウェブ

import { getRemoteConfig, fetchConfig, activate } from "firebase/remote-config";

const remoteConfig = getRemoteConfig(app);

// Set a 24-hour minimum fetch interval (86,400,000 ms)
remoteConfig.settings.minimumFetchIntervalMillis = 86400000;

// 1. Instantly activate values cached from the LAST session
activate(remoteConfig).then(() => {
    applyAppConfigurations();
});

// 2. Fetch new values in the background for the NEXT session
fetchConfig(remoteConfig).then(() => {
    // Optional: Activate values if needed
});

条件付きの「スマート」なフェッチを実装する

「次のセッションでフェッチ」パターンによって、Remote Config 値を更新する必要があるタイミングと、クライアント アプリでその値が使用可能になるタイミングとの間に過剰な遅延が生じる場合は、条件付きの「スマート」フェッチの採用を検討してください。

これを効果的に実装するには、画面が読み込まれるたび、タブが切り替わるたび、ビューがフォーカスを取得するたびなど、広範な UI ライフサイクル フックに fetch トリガーを付加しないようにします。

代わりに、明示的なアプリ アクションや状態に基づいて、フェッチ リクエストを次のように選択的にトリガーします。

  • ユーザーのログイン イベント
  • パラメータが使用される特定のユーザーフローへの移行(購入ファネルへの移行、ゲームでのレベルアップなど)

逆に、次のようなルーティン アクションのフェッチ リクエストはトリガーしないようにします。

  • ユーザーがアプリを開いたとき、または新しいセッションを開始したとき
  • アプリがバックグラウンド状態とフォアグラウンド状態の間を遷移したとき

次のステップ