遠端設定擷取效率最佳做法

Firebase Remote Config可讓您靈活控管應用程式的行為和外觀。這樣一來,您就能為應用程式推出功能及進行跨平台 A/B 測試,不必部署新版本或瀏覽多個應用程式商店更新。

無論您是在設計原型、經營成長中的新創公司,還是管理大規模的企業應用程式,管理網路擷取量都是提供快速、回應迅速的使用者體驗的關鍵。有效率的設定管理可減少冷啟動延遲時間、節省用戶端資料和電池用量,並避免不必要的網路負擔。此外,如果使用者族群快速擴大,導致日後用量增加,簡化 Remote Config 整合有助於確保用量維持高效率。

您可以調整應用程式擷取及啟用參數的方式和時機,大幅減少用戶端網路要求流量。

改用「擷取下一個工作階段」模式

常見的錯誤模式是在每次啟動應用程式時,使用 fetchAndActivate 呼叫 (透過網路擷取新值並啟用),並為先前擷取的值設定短暫的快取到期時間 (例如 15 分鐘到 1 小時)。這種做法背後的心理模型是,每當使用者開啟應用程式時,系統一律會擷取並套用最新值。雖然有時需要立即更新 (例如執行每日銷售活動或遊戲促銷),但請務必在達成該目標與對應用程式效能和擷取用量的影響之間取得平衡。

這種做法會在每次快取到期時強制執行新的網路呼叫,因此如果使用者一天開啟應用程式多次,就會產生大量擷取。

建議您改用 fetch 和 activate 呼叫,並設定較長的擷取間隔下限,採用「擷取下一個工作階段」模式。您仍可使用 fetchAndActivate,並設定較高的擷取間隔下限,因為 fetch 只會在快取失效時執行網路要求,但分開使用這兩項呼叫有助於鞏固模式,並將其確立為應用程式開發程序中的標準做法。此外,分開啟用可避免在工作階段中途套用設定值,進而干擾使用者體驗。

這個方法的運作方式

  • 啟動時立即啟用:立即套用上一個工作階段快取的設定 (0 毫秒網路延遲)。
  • 在背景擷取,並延長快取時間 (例如超過 12 或 24 小時):以非同步方式要求更新設定,重新整理下一個工作階段的本機快取。

如何最佳化擷取量

如果設定較長的擷取間隔下限,擷取要求就會減少。為「下一個」工作階段擷取新值,並為目前工作階段啟用快取值,代表應用程式會在較長的驗證期間內,立即從本機快取載入,進而提升使用者體驗。

舉例來說,如果您將 minimumFetchInterval 設為 24 小時,而使用者在一天內開啟應用程式 5 或 10 次,SDK 會自動直接從本機快取滿足第 2 到 10 次啟動,將該使用者每日網路要求次數從 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 值和用戶端應用程式可使用這些值之間造成過多延遲,請考慮採用條件式「智慧」擷取。

為有效實作這項功能,請避免將 fetch 觸發條件附加至廣泛的 UI 生命週期掛鉤,例如每次載入畫面、切換分頁或檢視畫面取得焦點時。

請改為根據明確的應用程式動作或狀態,選擇性地觸發擷取要求,例如:

  • 使用者登入事件
  • 轉換至使用參數的特定使用者流程 (例如進入結帳漏斗或在遊戲中升級)

相反地,請避免針對日常動作觸發擷取要求,例如:

  • 使用者開啟應用程式或開始新的工作階段時
  • 應用程式在背景和前景狀態之間轉換時

後續步驟