Firebase Messaging安卓端请求token时如何设置Sender Id
Android端最新版Firebase Messaging指定Sender ID获取Token实现方案
当前最新版Firebase Messaging(23.0.0+,对应Firebase BOM 32.0.0+)已废弃旧版getToken(senderId, scope)方法,需通过自定义FirebaseApp实例的方式实现指定Sender ID获取Token,适配多Firebase项目发送推送的场景。
前置依赖配置
在项目中引入最新版本的FCM依赖,推荐用Firebase BOM统一管理版本避免冲突:
// 项目级build.gradle配置 plugins { id 'com.android.application' version '8.0+' id 'com.google.gms.google-services' version '4.4.0' apply false } // 模块级build.gradle配置 plugins { id 'com.android.application' id 'com.google.gms.google-services' } dependencies { implementation platform('com.google.firebase:firebase-bom:32.7.0') implementation 'com.google.firebase:firebase-messaging' }
初始化指定Sender ID的Firebase实例
首先从发送推送的目标Firebase项目中获取以下参数:
- 发件人ID(Sender ID,路径:项目设置→云消息传递→发件人ID)
- Web API密钥(路径:项目设置→常规→Web API密钥)
- 项目ID(路径:项目设置→常规→项目ID)
- 对应安卓应用ID(路径:项目设置→常规→你的安卓应用→应用ID)
在应用启动阶段(如Application的onCreate方法中)初始化独立的FirebaseApp实例:
// Kotlin示例代码 val senderProjectOptions = FirebaseOptions.Builder() .setProjectId("发送端项目的项目ID") .setApiKey("发送端项目的Web API密钥") .setGcmSenderId("你需要设置的目标Sender ID") .setApplicationId("发送端项目绑定的安卓应用ID") .build() // 初始化自定义实例,第二个参数为自定义唯一标识,避免和默认应用实例冲突 try { FirebaseApp.initializeApp(this, senderProjectOptions, "custom_sender_app") } catch (e: IllegalStateException) { // 实例已初始化时捕获异常即可 }
获取对应Sender ID的FCM Token
通过自定义的FirebaseApp实例获取FCM实例,再请求对应Token:
val customSenderApp = FirebaseApp.getInstance("custom_sender_app") val fcmInstance = FirebaseMessaging.getInstance(customSenderApp) fcmInstance.token.addOnCompleteListener { task -> if (!task.isSuccessful) { Log.w("FCM_TOKEN", "获取对应Sender ID的Token失败", task.exception) return@addOnCompleteListener } // 此处获取到的就是对应指定Sender ID的FCM Token val targetToken = task.result // 后续将Token同步给你的业务服务端即可 }
注意事项
- 无需额外配置推送接收逻辑,默认集成的FCM服务即可接收所有合法Sender ID发来的推送,只需将对应Token交给对应发送端即可
- 不要频繁调用
getToken方法,FCM会自动管理Token生命周期,当Token更新时,可在重写的FirebaseMessagingService.onNewToken方法中重新触发上述逻辑,同步更新对应Sender ID的Token给服务端 - 所有配置参数必须和发送端的Firebase项目完全匹配,否则会出现Token获取失败、推送无法接收等问题
- 如无需长期使用自定义的FirebaseApp实例,可调用
FirebaseApp.getInstance("custom_sender_app").delete()释放资源
内容的提问来源于stack exchange,提问作者Mit_
相关产品推荐
相关产品推荐

