升级至最新版Firebase后,如何通过自定义FCM Sender ID获取FCM注册令牌?
我最近刚好碰到这个问题,折腾了一阵终于找到靠谱的解决办法,分享给你!
解决自定义FCM Sender ID获取注册令牌的问题
问题背景
升级到最新版Firebase后,原来通过FirebaseInstanceId.getInstance().getToken(fcmSenderId, "FCM")指定Sender ID获取令牌的方法被移除了。官方推荐的FirebaseMessaging.getInstance().token方法虽然能获取令牌,但不支持传入自定义Sender ID——如果你的项目已经配置了默认的google-services.json,但业务需要调用另一个FCM项目的服务,就会陷入困境。
核心思路:初始化多个FirebaseApp实例
Firebase允许在同一个应用中初始化多个独立的FirebaseApp实例,每个实例对应一个FCM项目。通过这种方式,我们就能分别获取不同Sender ID对应的注册令牌。
具体步骤
1. 准备第二个FCM项目的配置参数
你可以从第二个FCM项目的控制台下载对应的google-services.json,或者手动提取其中的关键参数:
apiKeyapplicationIdprojectIdmessagingSenderId(这就是你需要的自定义Sender ID)
2. 初始化第二个FirebaseApp实例
用提取到的参数构建FirebaseOptions,然后初始化一个带有唯一名称的FirebaseApp:
// 构建第二个FCM项目的配置 val secondFcmOptions = FirebaseOptions.Builder() .setApiKey("你的第二个项目API_KEY") .setApplicationId("你的第二个项目APP_ID") .setProjectId("你的第二个项目PROJECT_ID") .setMessagingSenderId("你的自定义FCM Sender ID") .build() // 初始化第二个FirebaseApp,指定唯一名称避免冲突 try { FirebaseApp.initializeApp(context, secondFcmOptions, "second_fcm_project") } catch (e: IllegalStateException) { // 如果已经初始化过,直接获取实例即可 FirebaseApp.getInstance("second_fcm_project") }
3. 获取对应Sender ID的注册令牌
通过刚才初始化的FirebaseApp实例,获取对应的FirebaseMessaging,再调用令牌获取方法:
// 获取第二个FCM项目对应的FirebaseMessaging实例 val secondMessaging = FirebaseMessaging.getInstance(FirebaseApp.getInstance("second_fcm_project")) // 获取注册令牌 secondMessaging.token.addOnCompleteListener { task -> if (task.isSuccessful) { task.result?.let { token -> println("自定义Sender ID对应的令牌:$token") // 在这里处理你的业务逻辑 } } else { println("获取令牌失败:${task.exception?.localizedMessage}") } }
补充提示
- 每个
FirebaseApp实例必须有唯一的名称,否则会抛出初始化异常 - 默认的
FirebaseApp(通过主google-services.json初始化的)不会被影响,你可以同时使用两个实例获取不同的令牌 - 确保第二个FCM项目的配置参数完全正确,尤其是
messagingSenderId,这直接关联到你需要的Sender ID
内容的提问来源于stack exchange,提问作者Rambo's son
相关产品推荐
相关产品推荐

