GCM 用户通知:缺少“registration_ids”字段

Posted

技术标签:

【中文标题】GCM 用户通知:缺少“registration_ids”字段【英文标题】:GCM User Notifications: Missing "registration_ids" field 【发布时间】:2013-11-01 04:24:33 【问题描述】:

我们的项目已被列入白名单,用于测试新的 GCM User Notifications API,该 API 允许将注册 ID 分组到单个“通知密钥”,然后可用于向用户拥有的所有设备发送消息。

但是,当我发送这样的请求时:

POST /gcm/send
Authorization: key=…
Content-Type: application/json

"notification_key": "…",
 "data": …

我收到错误响应:

400 Bad Request

Missing "registration_ids" field

使用registration_ids 字段而不是notification_key 发送消息可以解决问题(并且消息会被传递),但使用用户通知API 的全部意义在于使用notification_key 而不是@ 987654330@.

来自documentation:

registration_ids: […] 请求必须包含收件人——这可以是注册 ID、注册 ID 数组或 notification_key。必填。

notification_key: 将单个用户映射到与该用户关联的多个注册 ID 的字符串。这允许第 3 方服务器向单个用户拥有的多个应用程序实例(通常在多个设备上)发送单个消息。第 3 方服务器可以使用 notification_key 作为消息的目标,而不是单独的注册 ID(或注册 ID 数组)。 […] 可选。

以上示例使用位于https://android.googleapis.com 的HTTP 连接服务器。

到目前为止我尝试过:

registration_ids 包含一个空数组,没有帮助 将notification_key 值作为registration_ids 字段中的注册ID 发送也不起作用 将project_id 标头设置为我们的项目编号(根据创建notification_key 时的要求),仍然没有运气 使用CCS(XMPP)代替HTTP与GCM API服务器通信,可惜the IP is blocked on Google App Engine 在请求中同时包含 notification_keynotification_key_name,没有帮助

更新:根据建议的here,我还尝试将有效负载发布到/gcm/notification,并在JSON 请求有效负载中包含"operation": "send" 属性。仍然没有帮助。现在我明白了:

"error":"Missing \"registration_ids\" field"

同样的事情,只是这次是用 JSON 编码发回的。

【问题讨论】:

registration_ids 是您在设备注册到 GCM 后得到的东西。您必须先将此 id 存储到您的数据库中,然后使用它来发送通知 @SunilMishra 我可以使用registration_ids 生成notification_key,然后我应该能够使用notification_key 而不是 registration_ids 您是否尝试在请求中同时包含notification_keynotification_key_name @Eran 我现在已经尝试过了(包括密钥和密钥名称),我得到了和以前一样的错误,缺少 registration_ids 字段。 你有什么消息吗?你成功了吗?我们也有类似的问题。 【参考方案1】:

文档有问题,你必须使用这个请求:

curl -vvv -X POST --header "Content-Type: application/json" --header "project_id: <YOUR-PROJECT-ID>" --header "Authorization: key=<YOUR-PROJECT-SECRET-KEY>" --data @- "https://android.googleapis.com/gcm/send" << EOF
 
   "to": "<NOTIFICATION-ID>",
   "data": ,

EOF

更多详情请查看我的博文https://medium.com/appunite-edu-collection/d7df385b0ff4

【讨论】:

你完全正确。我从“notification_key”更改为“to”并且它有效。文档真的有问题! 我如何再给@Jacek Marchwicki 投票几次?!我还要注意,我必须在标题中使用我的“项目编号”而不是“项目 ID” GCM 文档竟然有这么错误,这太荒谬了!谢谢! 项目编号@xbakesx 是什么意思?我只看到项目 ID 和项目名称(虽然 ID 是一个数字) 我仍然收到 500 内部服务器错误。【参考方案2】:
    Have you got project_id for your project. 
    If yes then have you included same at proper place.

签出this ..

【讨论】:

上游消息需要项目 ID。对于下游(服务器 -> GCM -> Android),GCM 接受一个 API 密钥(作为“授权”标头的一部分),然后用于验证服务器并将其连接到相应的项目。 project_id 是 GCM 需要的,以了解需要注意哪个应用程序...一旦 GCM 找到所需的项目,它就会通过获取用户的 device_id 来发出通知。 不,GCM 可以仅根据 API 密钥识别请求,用户通知 API 不应要求 device_id。请仔细阅读我的问题。此外,我尝试包括项目 ID,以防万一。它没有帮助。【参考方案3】:

我也遇到了这个问题“HTTP/1.1 401 Unauthorized”。 而且,我通过用浏览器密钥替换 API 密钥解决了这个问题。

如果您的应用程序在客户端上运行,请使用浏览器密钥。

请参考以下链接: https://developers.google.com/console/help/new/#generatingdevkeys

【讨论】:

以上是关于GCM 用户通知:缺少“registration_ids”字段的主要内容,如果未能解决你的问题,请参考以下文章

Android GCM 缺少注册 C#

仅接收来自 GCM 的最后一个后台静默推送通知

GCM 用户通知 404

有时一些 android 用户没有通过 GCM 收到推送通知

推送通知错误 - 缺少注册

限制发送推送通知(防止垃圾邮件) - GCM