Firebase FCM 错误:“无效注册”

问题描述 投票:0回答:8

我目前正在尝试在

PushNotification
的帮助下使用
Device Group
FCM
发送到
Firebase Cloud Functions
,但是一旦发送通知,它会返回代码
200
但失败:

SUCCESS response= {
multicast_id: 8834986220110966000,
success: 0,
failure: 1,
canonical_ids: 0,
results: [ { error: 'InvalidRegistration' } ] 
}

这是我用来发送此通知的代码...我缺少什么?

const options = {
    method: 'POST',
    uri: 'https://fcm.googleapis.com/fcm/send',
    headers: {
       'Authorization': 'key=' + serverKey,
    },
    body: {
       to: groupId,
       data: {
        subject: message
       },
       notification: {
         title: title,
         body: body,
         badge: 1,
        },
       content_available: true
    },
    json: true
};

return rqstProm(options)
    .then((parsedBody) => {
        console.log('SUCCESS response=', parsedBody);
    })
    .catch((err) => {
        console.log('FAILED err=', err);
    });

其中 JSON 值

title
body
subject
message
String

javascript node.js firebase firebase-cloud-messaging
8个回答
39
投票

就我而言,我正在向主题发送通知(“

topics/my-topic
”)。我在主题开头缺少前置
/
,所以我遇到了同样的问题。所以主题应该是
/topics/my-topic

也许这有帮助!


5
投票

有一种更简单的方法可以从云功能向设备组发送消息。使用 admin.messaging().sendToDeviceGroup()。示例代码和说明位于本指南

我认为您当前的方法失败了,因为

groupId
中提供的组通知键有问题。它应该是创建设备组时返回的字符串键值。 此表中列出了错误代码。对于 200/无效注册,上面写着:

检查您传递给服务器的注册令牌的格式。 确保它与客户端应用程序收到的注册令牌匹配 注册 Firebase 通知。请勿截断或添加 额外的字符。


4
投票

这个无效注册错误让我失去了理智。

最终问题是我将我的设备订阅到

"example"
但发送了通知 json
to: "example"

但我们实际上需要发送至

"/topics/example"

我生命中的2个小时被浪费了..


0
投票

注册令牌与特定的发送者组相关联。当客户端应用程序注册 FCM 时,它必须指定允许哪些发件人发送消息。向客户端应用程序发送消息时,您应该使用这些发件人 ID 之一。

您需要做的就是添加一个带有您的发件人 ID 的 http 标头“project_id”。


0
投票

我正在
InvalidRegistration

基本含义:您使用了错误的令牌。 为什么? 当您在

registrationToken
(
docs
) 中获得新的 onNewToken,但由于某种原因您正在使用旧令牌时,可能会发生这种情况。这可能发生在以下情况:

  • 您正在使用不同的推送通知库,该库记住令牌(将其存储在本地某处),并且您没有使用新令牌更新该库。

  • 您的应用程序(或其他库依赖项)实现了另一个

    FirebaseMessagingService
    ,并且它们发生冲突。当给它一个新令牌时,只有一个服务可以接受(响应)FirebaseMessaging Android 库发送的操作。您可以通过在 Android Studio 中打开
    AndroidManifest.xml
    并选择选项卡底部的
    Merged Manifest
    选项卡来仔细检查这一点。您还可以将调试器放置在您使用的每个库的每个服务中。您会看到只有一项服务的
    onNewToken
    被调用。

    当它们发生冲突时,无法获得正确的令牌,并且注册的 FCM 注册令牌将是错误的。向错误的注册发送消息会让您

    InvalidRegistration


0
投票

对我来说,我从模型中传递了

Id
而不是用户的代币,这是一个错误


0
投票

自 2024 年 6 月起,旧版云消息 API 将被弃用

因此,解决方案是迁移到新的 API:

HTTP v1 API
,它使用 OAuth 2.0 授权

这里有完整的文档

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA

{
   "message":{
      "token":["bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."],
      "notification":{
        "body":"This is an FCM notification message!",
        "title":"FCM Message"
      }
   }
}

但是,为了获得这个
Bearer: whatever
代币

无论如何,您都需要一个服务器,无论是 Google Cloud Function,还是带有 Google Admin SDK 的自定义服务器,以使用“服务帐户”私有 json 文件生成令牌,您可以从 项目设置 > 生成该文件服务帐户并单击生成新私钥

以下是如何获得令牌!

所以,无论如何你都需要服务器!

最简单的方法是创建一个谷歌云功能来为您发送通知并向其发出http请求。


-2
投票

InvalidRegistration
仅表示令牌无效或已过期。您可以卸载该应用程序,然后重新安装并获取新令牌,然后尝试使用该令牌。这绝对能解决你的问题。

您可以在这里阅读更多内容。

© www.soinside.com 2019 - 2024. All rights reserved.