如何构建对 GCM 云连接服务器 (XMPP) 的通知密钥请求?
Posted
技术标签:
【中文标题】如何构建对 GCM 云连接服务器 (XMPP) 的通知密钥请求?【英文标题】:How do I structure a notification key request to GCM Cloud Connection Server (XMPP)? 【发布时间】:2014-07-25 18:45:04 【问题描述】:我想创建一个用户通知键来按用户对设备通知进行分组。这个话题写在GCM documentation on User Notifications。
GCM 文档声称支持 XMPP 和 HTTP 连接的通知密钥请求,但没有提供有关 XMPP 消息结构的任何示例。
我现在正在尝试请求通知密钥。我使用了文档中提供的信息并将我的请求消息结构化:
<message id="XK4EG-6"><gcm xmlns="google:mobile:data">"operation":"create","notification_key_name":"appUser-Chris","registration_ids":["4","8","15"]</gcm></message>
我从 GCM 收到以下错误:
<message id="XK4EG-6" type="error" to="I REMOVED THIS"><gcm xmlns="google:mobile:data">"operation":"create","notification_key_name":"appUser-Chris","registration_ids":["4","8","15"]</gcm><error code="400" type="modify"><bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/><text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">InvalidJson: JSON_PARSING_ERROR : Missing Required Field: message_id</text></error></message>
我之前发给 GCM 的任何消息都没有收到此类错误,因此我不确定如何处理它。似乎我缺少消息 ID,但这不是通知密钥请求所必需的。有人处理过吗?
【问题讨论】:
【参考方案1】:我遇到了类似的问题,因此我已经研究了几个小时,这是结论。
您在 JSON 负载中缺少 "message_id": 参数,它是 CCS 中的必需参数!:
message_id:在 CCS 中,唯一标识 XMPP 连接中的消息。该值是唯一标识关联消息的字符串。该值是一个字符串。 必填。
请注意, GCM documentation on User Notifications 主题中没有包含 "message_id":,因为使用的是 HTTP 连接服务器。
此外,请注意 XMPP "registration_ids": 参数在 XMPP 实现中不存在,您应该改用 "to": 参数,它只允许您每条消息传递一个注册ID。在 XMPP 中,"to": 参数的值是一个字符串,而不是字符串数组:
to: 在 CCS 中,用于代替 registration_ids 来指定消息的接收者。它的值必须是注册 ID。 值是一个字符串。必需。
现在,你应该有这样的东西:
// This is code for a python xmpp server version
send_queue.append("operation": "create",
"message_id": random_id(),
"to": REGISTRATION_ID,
"notification_key_name": "appUser-User1")
但这只会给我一个 ACK。我期待一个 notification_key 但我只收到一个 ACK,我不知道为什么。
服务器日志:
从服务器发送消息:
<message id="3"><gcm xmlns="google:mobile:data">to: I REMOVED THE ID, operation: create, notification_key_name: appUser-User1, message_id: 5xEYEIHZ</gcm></message>
收到消息:
<message><data:gcm xmlns:data="google:mobile:data">"message_id":"5xEYEIHZ","message_type":"ack","from":"I REMOVED THE ID"</data:gcm></message>
这是一个 ACK,但不是预期的 register_key :(
结论
我认为目前无法从 XMPP 服务器获取通知密钥。 Documentacion 不可用,我尝试的方法返回 ACK 但不返回通知键。 目前,我们只能使用 HTTP 方法,效果很好,我从 linux 控制台进行了测试:
curl --header "Authorization: key=YOUR_KEY" --header "Content-Type: application/json" --header "project_id:YOUR_PROJECT_ID" https://android.googleapis.com/gcm/send -d "\"operation\":\"create\",\"notification_key_name\":\"appUser-User\",\"registration_ids\":[\"YOUR_REGISTRATION_ID\"]"
输出:
"multicast_id":7151337537866826426,"success":1,"failure":0,"canonical_ids":0,"results":["message_id":"0:1406728451796338%921c249af9fd7ecd"]
【讨论】:
以上是关于如何构建对 GCM 云连接服务器 (XMPP) 的通知密钥请求?的主要内容,如果未能解决你的问题,请参考以下文章
Android- Open Fire、云连接服务器和 GCM 之间的区别