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

使用 Kotlin 的 Firebase 云消息传递 Android

Firebase 云消息传递重复通知

Firebase 云消息传递 - 如何验证令牌?

Firebase 云消息传递令牌和服务器密钥有啥区别?