如何使用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端实现示例
- 获取当前应用版本号
private fun getCurrentAppVersion(): String { return try { val packageInfo = packageManager.getPackageInfo(packageName, 0) packageInfo.versionName } catch (e: Exception) { "1.0.0" } }
- 初始化并拉取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() } }
- 版本对比与强制更新弹窗
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端实现示例
- 获取当前应用版本号
private func getCurrentAppVersion() -> String { guard let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else { return "1.0.0" } return version }
- 拉取并处理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) } }
- 版本对比与强制更新弹窗
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() }
三、测试方法
- 在Firebase控制台将
minimum_required_version设为一个比你当前测试应用版本更高的版本号 - 启动测试应用,验证是否弹出强制更新弹窗,点击按钮是否能跳转到应用商店
- 测试完成后,将
minimum_required_version改回正常版本号并发布更改
内容的提问来源于stack exchange,提问作者OEThe11
相关产品推荐
相关产品推荐

