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

如何使用Firebase Remote Config实现Android应用强制更新通知

用Firebase Remote Config实现应用强制更新(Force Update)机制

一、Firebase控制台配置Remote Config参数

首先在Firebase控制台的Remote Config页面添加以下3个核心参数(参数类型均选字符串):

  • minimum_required_version:设置应用必须更新到的最低版本号,比如 "2.1.0"
  • force_update_message:给用户的强制更新提示语,比如 "当前版本已停止服务,请立即更新至最新版本以继续使用"
  • update_url:应用商店的跳转链接,Android填Google Play链接,iOS填App Store链接

配置完成后点击「发布更改」,确保参数生效。

二、客户端实现逻辑

核心逻辑是:应用启动时,拉取Remote Config参数,对比当前应用版本与最低要求版本,若当前版本低于要求,则弹出强制更新对话框,限制用户进入应用。

Android端实现示例

  1. 获取当前应用版本号
private fun getCurrentAppVersion(): String {
    return try {
        val packageInfo = packageManager.getPackageInfo(packageName, 0)
        packageInfo.versionName
    } catch (e: Exception) {
        "1.0.0"
    }
}
  1. 初始化并拉取Remote Config参数
// 初始化Remote Config
val remoteConfig = Firebase.remoteConfig
val configSettings = remoteConfigSettings {
    // 测试阶段可将缓存时长设为0,正式环境建议设为3600(1小时)
    minimumFetchIntervalInSeconds = if (BuildConfig.DEBUG) 0 else 3600
}
remoteConfig.setConfigSettingsAsync(configSettings)

// 拉取并激活参数
remoteConfig.fetchAndActivate().addOnCompleteListener { task ->
    if (task.isSuccessful) {
        checkForceUpdate(remoteConfig)
    } else {
        // 拉取失败时,可选择允许进入应用或重试
        proceedToApp()
    }
}
  1. 版本对比与强制更新弹窗
private fun checkForceUpdate(remoteConfig: FirebaseRemoteConfig) {
    val requiredVersion = remoteConfig.getString("minimum_required_version")
    val currentVersion = getCurrentAppVersion()
    
    // 版本号比较逻辑:拆分版本号为整数数组逐一对比
    val requiredParts = requiredVersion.split(".").map { it.toInt() }
    val currentParts = currentVersion.split(".").map { it.toInt() }
    
    var needUpdate = false
    for (i in 0 until min(requiredParts.size, currentParts.size)) {
        if (currentParts[i] < requiredParts[i]) {
            needUpdate = true
            break
        } else if (currentParts[i] > requiredParts[i]) {
            break
        }
    }
    // 处理版本号长度不一致的情况,比如当前版本是"2.0",要求版本是"2.0.1"
    if (!needUpdate && currentParts.size < requiredParts.size) {
        needUpdate = true
    }
    
    if (needUpdate) {
        val updateMessage = remoteConfig.getString("force_update_message")
        val updateUrl = remoteConfig.getString("update_url")
        
        AlertDialog.Builder(this)
            .setTitle("版本更新")
            .setMessage(updateMessage)
            .setCancelable(false) // 禁止用户取消弹窗
            .setPositiveButton("立即更新") { _, _ ->
                val intent = Intent(Intent.ACTION_VIEW, Uri.parse(updateUrl))
                startActivity(intent)
                finish() // 关闭当前应用
            }
            .show()
    } else {
        proceedToApp() // 版本符合要求,进入应用主界面
    }
}

private fun proceedToApp() {
    // 跳转至应用主页面
    startActivity(Intent(this, MainActivity::class.java))
    finish()
}

iOS端实现示例

  1. 获取当前应用版本号
private func getCurrentAppVersion() -> String {
    guard let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else {
        return "1.0.0"
    }
    return version
}
  1. 拉取并处理Remote Config参数
// 初始化Remote Config
let remoteConfig = RemoteConfig.remoteConfig()
let settings = RemoteConfigSettings()
// 测试阶段缓存时长设为0,正式环境设为3600
settings.minimumFetchInterval = BuildConfig.debug ? 0 : 3600
remoteConfig.configSettings = settings

// 拉取并激活参数
remoteConfig.fetch(withExpirationDuration: TimeInterval(settings.minimumFetchInterval)) { status, error in
    guard error == nil, status == .success else {
        // 拉取失败,进入应用或重试
        self.proceedToApp()
        return
    }
    
    remoteConfig.activate { _, error in
        guard error == nil else {
            self.proceedToApp()
            return
        }
        self.checkForceUpdate(remoteConfig: remoteConfig)
    }
}
  1. 版本对比与强制更新弹窗
private func checkForceUpdate(remoteConfig: RemoteConfig) {
    let requiredVersion = remoteConfig.configValue(forKey: "minimum_required_version").stringValue ?? "1.0.0"
    let currentVersion = getCurrentAppVersion()
    
    // 版本号比较逻辑
    let requiredParts = requiredVersion.split(separator: ".").compactMap { Int($0) }
    let currentParts = currentVersion.split(separator: ".").compactMap { Int($0) }
    
    var needUpdate = false
    for i in 0..<min(requiredParts.count, currentParts.count) {
        if currentParts[i] < requiredParts[i] {
            needUpdate = true
            break
        } else if currentParts[i] > requiredParts[i] {
            break
        }
    }
    if !needUpdate && currentParts.count < requiredParts.count {
        needUpdate = true
    }
    
    if needUpdate {
        let updateMessage = remoteConfig.configValue(forKey: "force_update_message").stringValue ?? "请更新至最新版本以继续使用"
        let updateUrl = remoteConfig.configValue(forKey: "update_url").stringValue ?? ""
        
        let alert = UIAlertController(title: "版本更新", message: updateMessage, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "立即更新", style: .default) { _ in
            if let url = URL(string: updateUrl) {
                UIApplication.shared.open(url)
            }
            // 关闭应用(iOS 13+可使用UIApplication.shared.terminate(),或让用户手动关闭)
            exit(0)
        })
        alert.isModalInPresentation = true // 禁止用户通过滑动关闭弹窗
        present(alert, animated: true)
    } else {
        proceedToApp()
    }
}

private func proceedToApp() {
    // 跳转至应用主界面
    let mainVC = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()
    window?.rootViewController = mainVC
    window?.makeKeyAndVisible()
}

三、测试方法

  1. 在Firebase控制台将minimum_required_version设为一个比你当前测试应用版本更高的版本号
  2. 启动测试应用,验证是否弹出强制更新弹窗,点击按钮是否能跳转到应用商店
  3. 测试完成后,将minimum_required_version改回正常版本号并发布更改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:27:25