Android Firebase 云消息传递令牌 (FCM) 令牌太短/不完整
Posted
技术标签:
【中文标题】Android Firebase 云消息传递令牌 (FCM) 令牌太短/不完整【英文标题】:Android Firebase Cloud Messaging Token (FCM) token is too short/incomplete 【发布时间】:2021-12-12 01:58:00 【问题描述】:过去几天我一直在使用 Azure 通知中心,尝试在 ASP NET 和 Dart/Kotlin 中设置推送通知。我一直在为 FCM/PNS 令牌苦苦挣扎。
当我注册我的应用时,我会得到这个令牌:ddGYUP9OSdi2YR9Y******
,使用 * 以防万一。
在开发过程中,我发现我有一个与 Hubs 相关的注册,其令牌为:ddGYUP9OSdi2YR9Y******:APA91bMANCn_SZQV8bUJCWOiyPzdXaBPrqLmqIk8ELj6RfCx5TKNR2hLmiNMfuyK7LdY70-BtMxxyRbituhPH2t5v9p0A-8qkCleEgOWi4cXcvKpxedW2QmqEmym-hk8oZOXdx-*****
它是相同的标记,但在分号后添加了一些内容。这是什么,它来自哪里?
我从FirebaseInstallations.getInstance().id
获得第一个令牌,并且我注册的每个设备的令牌长度都相似。但是,在我的 ASP NET 项目中,向设备发送通知仅适用于较长的令牌。当我使用 Firebase 控制台测试通知时:Firebase - Engage - Cloud Messaging - Compose Notification,只有长的有效。这让我相信我的注册码有问题。
那么短标记上冒号后面的额外内容是什么?
我为感兴趣的人获取 FCM 令牌的代码。
private fun getDeviceToken() : String
if(!playServicesAvailable)
throw Exception(getPlayServicesError())
val token = PushNotificationsFirebaseMessagingService.token
if (token.isNullOrBlank())
throw Exception("Unable to resolve token for FCM.")
return token
【问题讨论】:
您从 FirebaseInstallations.getInstance().id 获得的短消息是deviceId
,而长消息是 deviceId:token
的组合,用于引导推送消息到实际的设备应用安装组合。
【参考方案1】:
令牌字符串以冒号结尾的假设是错误的......PushNotificationsFirebaseMessagingService
只是返回一个无效的令牌
并且该问题没有任何PushNotificationsFirebaseMessagingService
。
if (token.isNullOrBlank() || !token.contains(":"))
throw IllegalArgumentException("bad or no token given")
【讨论】:
我从没想过它是,问题是询问有关 FCM 令牌是什么的更多信息。我所有的代码都和firebase/microsoft提供的教程代码一样,如果你愿意我可以证明。 非常不清楚,PushNotificationsFirebaseMessagingService
到底是什么。除非提供它,否则您不能就它提出问题。 registration_id
(令牌)应该有 152-326 个字符(给予或接受)。【参考方案2】:
发现问题。一个微软文档有
FirebaseInstallations
.getInstance()
.id
.addOnCompleteListener(OnCompleteListener task ->
if (!task.isSuccessful)
return@OnCompleteListener
PushNotificationsFirebaseMessagingService.token = task.result
PushNotificationsFirebaseMessagingService.notificationRegistrationService?.refreshRegistration()
)
在创建时。所以那个“令牌”只是安装 ID。
如 Firebase 文档中所示,令牌的正确代码是
FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener task ->
if(!task.isSuccessful)
print("Fetching FCM registration token failed")
return@OnCompleteListener
val token = task.result
PushNotificationsFirebaseMessagingService.token = token;
)
【讨论】:
以上是关于Android Firebase 云消息传递令牌 (FCM) 令牌太短/不完整的主要内容,如果未能解决你的问题,请参考以下文章
在 FCM(Firebase 云消息传递)中,在通知中包含令牌是不是安全?
Firebase 云消息传递为已取消订阅的令牌返回 200 OK