FCM升级至24.0.1后为何需google-services.json?原FirebaseOptions方案失效?
FCM升级24.0.1后初始化问题解答
1. 为何原FirebaseOptionsBuilder方案无法再使用?
核心是你的代码初始化逻辑和新版FCM的实例匹配规则不兼容:
- 你初始化的是命名为"SDK"的非默认FirebaseApp实例,但调用
FirebaseMessaging.getInstance()时未指定该实例,默认会去获取未初始化的默认FirebaseApp,而新版FCM强制要求默认实例有合法配置来源(优先google-services.json),找不到就触发崩溃。 - 新版FCM部分内部组件依赖
google-services.json解析注入的元数据(如google_app_id),若未通过插件或手动注入这些元数据,部分初始化流程会报错。 - 并非
FirebaseOptionsBuilder方案彻底失效,而是你的代码没正确将自定义实例绑定到FirebaseMessaging。
2. 可行的SDK端消息管理方案
修正FCM手动初始化逻辑
只需在获取FirebaseMessaging时指定你初始化的命名实例即可:
val options = FirebaseOptions.Builder() .setGcmSenderId(firebaseConfig!!.GcmSenderId) .setApiKey(firebaseConfig.ApiKey) .setApplicationId(firebaseConfig.ApplicationId) .setStorageBucket(firebaseConfig.StorageBucket) .setProjectId(firebaseConfig.ProjectId) .setDatabaseUrl(firebaseConfig.DatabaseUrl) .build() // 初始化命名为"SDK"的FirebaseApp val firebaseApp = FirebaseApp.initializeApp(context, options, "SDK") // 获取对应实例的FirebaseMessaging FirebaseMessaging.getInstance(firebaseApp).token.addOnCompleteListener { task -> if (!task.isSuccessful) { Log.w("Test", "Fetching FCM registration token failed", task.exception) return@OnCompleteListener } val token = task.result Log.d("Test", token) }
其他替代方案
若不想依赖FCM,可选择第三方聚合推送服务(如极光推送、个推),或各厂商原生推送服务(华为、小米、OPPO等),这些服务大多支持动态配置初始化参数,无需本地配置文件。
3. 回退至旧版本是否可行?
技术上可行,但强烈不推荐:
- 旧版本的
FirebaseInstanceIdAPI已被官方标记为废弃,后续不会再更新功能或修复安全漏洞,可能出现与Android 14+等新系统版本的兼容性问题。 - 未来Firebase服务端可能停止接收旧版本SDK生成的Token,导致消息推送失效。
内容的提问来源于stack exchange,提问作者Preet Patel
相关产品推荐
相关产品推荐

