You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FirebaseRemoteConfig版本条件配置在应用更新后如何强制拉取新值

Firebase Remote Config 应用更新后强制拉取最新配置方案

Firebase Remote Config 不会自动感知应用版本变更,本地缓存的配置是上次拉取时服务端根据当时请求携带的版本号等属性返回的结果,默认缓存到期前不会主动发起新请求,因此版本更新后旧缓存的版本条件匹配结果不会自动失效,需要主动触发强制拉取。

核心实现方案

  • 本地持久化标记上次启动的应用版本号
    每次应用冷启动时,读取本地存储的历史版本标识(安卓用versionCode、iOS用CFBundleVersion作为唯一判断依据,避免同版本名不同构建包判断失效),和当前运行的应用版本号做对比,若不一致则判定为「应用更新后首次启动」。
  • 版本变更场景下传入0缓存间隔触发拉取
    判定为更新后首次启动时,调用fetch方法时将缓存过期时长参数设为0,强制跳过本地缓存向服务端发起请求,服务端会根据当前请求携带的新版本号匹配对应条件的配置值返回。非版本更新场景保持默认的缓存间隔(生产环境建议设为12小时)即可,避免频繁请求触发服务端限流。
  • 拉取激活成功后更新本地存储的版本标记
    确认配置拉取并激活完成后,把当前版本号写入本地持久化存储,后续同版本启动就走正常缓存逻辑,不会重复强制拉取。

代码示例

Android (Kotlin)

val remoteConfig = FirebaseRemoteConfig.getInstance()
val appPrefs = getSharedPreferences("app_base_config", MODE_PRIVATE)

// 读取历史版本号
val lastInstalledVersion = appPrefs.getLong("last_version_code", -1L)
val currentVersion = packageManager.getPackageInfo(packageName, 0).longVersionCode

// 版本变更时缓存间隔设为0,否则用12小时默认值
val fetchExpireDuration = if (lastInstalledVersion != currentVersion) {
    0L
} else {
    TimeUnit.HOURS.toSeconds(12)
}

remoteConfig.fetch(fetchExpireDuration)
    .addOnCompleteListener { fetchTask ->
        if (fetchTask.isSuccessful) {
            remoteConfig.activate().addOnCompleteListener {
                // 激活成功后更新本地版本标记
                appPrefs.edit()
                    .putLong("last_version_code", currentVersion)
                    .apply()
            }
        }
    }

iOS (Swift)

let remoteConfig = RemoteConfig.remoteConfig()
let userDefaults = UserDefaults.standard

// 读取历史版本号
let lastInstalledVersion = userDefaults.integer(forKey: "last_version_code")
guard let currentVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String,
      let currentVersionInt = Int(currentVersion) else { return }

// 版本变更时缓存间隔设为0,否则用12小时(43200秒)默认值
let fetchExpireDuration: TimeInterval = lastInstalledVersion != currentVersionInt ? 0 : 43200

remoteConfig.fetch(withExpirationDuration: fetchExpireDuration) { fetchStatus, fetchError in
    guard fetchError == nil, fetchStatus == .success else { return }
    remoteConfig.activate { _, activateError in
        guard activateError == nil else { return }
        // 激活成功后更新本地版本标记
        userDefaults.set(currentVersionInt, forKey: "last_version_code")
    }
}

注意事项

  • 禁止在生产环境全量场景下将fetch间隔固定为0,Firebase Remote Config 对短时间高频请求有客户端限流规则,触发后会在一段时间内返回节流错误,无法拉取最新配置。
  • 版本判断优先用自增的构建号(安卓versionCode、iOSCFBundleVersion),不要只用对外展示的版本名,避免同版本名不同测试包出现判断错误。
  • 配置拉取后必须调用activate()方法才会让新拉取的配置生效,只fetch不激活依然会使用本地旧缓存值。

内容的提问来源于stack exchange,提问作者gbaccetta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:21:34