我目前正在尝试在Firebase Cloud Functions
的帮助下使用FCM
向Device Group
发送PushNotification
,但是一旦发送通知,它就会返回代码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
就我而言,我正在向主题("topics/my-topic
")发送通知。我在主题开头缺少前缀/
,所以我遇到了同样的问题。所以主题应该是/topics/my-topic
.
也许这有帮助!!
有一种更简单的方法可以从云函数向设备组发送消息。 使用 admin.messaging().sendToDeviceGroup()。 本指南中提供了示例代码和说明。
我认为您当前的方法失败了,因为groupId
中提供的组通知密钥有问题。 它应该是创建设备组时返回的字符串键值。 下表列出了错误代码。 对于 200/无效注册它说:
检查传递给服务器的注册令牌的格式。 确保它与客户端应用收到的注册令牌匹配 从注册 Firebase 通知开始。不要截断或添加 其他字符。
我对这个无效注册错误失去了理智。
最终的问题是我正在为"example"
订阅我的设备,但发送了通知jsonto: "example"
。
但我们实际上需要发送给"/topics/example"
浪费了我生命的2个小时。
注册令牌与一组特定的发件人相关联。当客户端应用注册 FCM 时,它必须指定允许哪些发件人发送消息。向客户端应用发送消息时,应使用这些发件人 ID 之一。
您需要做的是添加一个带有发件人ID的http标头"project_id"。
我得到了InvalidRegistration
:
基本含义:您使用了错误的令牌。为什么?当您在onNewToken
(docs) 中为您提供新registrationToken
时,可能会发生这种情况,但由于某种原因您使用的是旧令牌。在以下情况下可能会发生这种情况:
正在使用不同的推送通知库,该库会记住令牌(将其存储在本地的某个位置),并且您没有使用新令牌更新该库。
您的应用程序(或其他库依赖项)实现了另一个
FirebaseMessagingService
,并且它们相互冲突。只有一个服务可以接受(响应)FirebaseMessaging Android库发送的操作,当它被赋予新令牌时。您可以通过在 Android Studio 中打开AndroidManifest.xml
并选择选项卡底部的"Merged Manifest
"选项卡来仔细检查这一点。还可以将调试器放置在您使用的每个库的每个服务中。你将看到只调用了一个服务的onNewToken
。当它们发生冲突时,无法获得正确的令牌,并且注册的 FCM 注册令牌将是错误的。向错误的注册发送消息会让您
InvalidRegistration
。
对我来说,我从模型中传递Id
而不是用户的令牌是一个错误
>InvalidRegistration
只是意味着令牌无效或已过期。您可以卸载该应用程序,然后重新安装并获取新令牌,然后尝试使用该令牌。这肯定会解决您的问题。
您可以在此处阅读更多内容。