【问题标题】:How do I structure a notification key request to GCM Cloud Connection Server (XMPP)?如何构建对 GCM 云连接服务器 (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,但这不是通知密钥请求所必需的。有人处理过吗?

【问题讨论】:

    标签: android google-cloud-messaging


    【解决方案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"}]}
    

    【讨论】:

      猜你喜欢
      • 2013-07-15
      • 2016-01-18
      • 1970-01-01
      • 2023-04-08
      • 2023-03-16
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多