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

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 生命週期掛鉤,例如每次載入畫面、切換分頁或檢視畫面取得焦點時。

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

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

反之,請避免觸發例行動作的擷取要求,例如:

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

後續步驟