Android FCM Token过短无法推送,冒号后附加内容来源是什么?
FCM Token长短差异问题解答
冒号后内容的本质
- 你观察到的冒号后内容是FCM专属推送身份校验串,和你拿到的短前缀共同组成完整的FCM推送有效凭证,是Firebase服务用来定位推送目标、校验请求合法性的核心标识,仅当前缀+校验串完整拼接时,才是可用于推送的有效Token。
- 你用
FirebaseInstallations.getInstance().id获取到的短Token不是推送用的FCM Token,而是Firebase安装ID(FID),作用仅为唯一标识当前设备上的应用安装实例,本身不具备推送能力,所以不管是Firebase控制台推送还是你ASP.NET后端发通知,都只能用完整长Token。
问题根因
你混淆了Firebase提供的两类不同用途的标识:
- Firebase安装ID(FID):通过
FirebaseInstallations.getInstance().id获取,用于标识应用安装实例,适配用户分群、数据统计等场景,格式为短字符串,就是你拿到的ddGYUP9OSdi2YR9Y******格式 - FCM推送Token:通过
FirebaseMessaging.getInstance().getToken()获取,是推送通知的唯一凭证,格式为「FID:APA91b开头的长校验串」,就是你在Azure Notification Hub里看到的长Token
代码修复方案
你当前的Token获取逻辑错误,不要用FirebaseInstallations的返回值作为推送Token,需通过FirebaseMessaging的异步接口获取完整推送Token,参考修正后的代码:
private fun getDeviceToken(onSuccess: (String) -> Unit, onError: (Exception) -> Unit) { if(!playServicesAvailable) { onError(Exception(getPlayServicesError())) return } // 正确获取完整FCM推送Token的方式 FirebaseMessaging.getInstance().token.addOnCompleteListener { task -> if (!task.isSuccessful) { onError(Exception("获取FCM Token失败:${task.exception?.message}")) return@addOnCompleteListener } val fullToken = task.result if (fullToken.isNullOrBlank()) { onError(Exception("Unable to resolve token for FCM.")) return@addOnCompleteListener } // 此处拿到的fullToken就是完整长Token,直接传给Azure Notification Hub注册即可 onSuccess(fullToken) } }
修正后拿到的完整Token即可同时支持Firebase控制台测试推送、后端ASP.NET接口推送。
内容的提问来源于stack exchange,提问作者flutterisbae
相关产品推荐
相关产品推荐

