3

我想使用 GCM 一次向多个注册设备发送多个通知,我知道使用纯文本无法做到这一点,因为它只能用于一次发送一个设备的通知。因此,我决定使用 JSON 制作 HTTP 正文内容,并设法制作了以下表示 JSON 对象的字符串:

{ collapse_key : my_CollapseKey, data.message : myMessage,  registration_ids : ["regid1","regid2",...] }

但是每当我发送请求时,我都会收到一个 400 响应,其中说明了错误请求,当我参考GCM 架构概述的文档时,它指出

响应 400 仅适用于 JSON 请求。表示请求无法解析为 JSON,或者它包含无效字段(例如,在需要数字的地方传递字符串)

这是我在 ASP.Net 中开发的用于发送请求的 Web 应用程序的快照:

request.ContentType = "application/json"
        request.Headers.Add("Authorization: key=My_Server_Key")
        request.Headers.Add("Sender: id=myProject_ID")
        Dim collapsKey = Guid.NewGuid.ToString("n")
        Dim data As String = "{ collapse_key : " + collapsKey + "," + " data.message : " + HttpUtility.UrlEncode(TextBox1.Text) + "}" + ", registration_ids : " + jsonids1 + "}"
        Dim byteArray As Byte() = Encoding.UTF8.GetBytes(data)
        request.ContentLength = byteArray.Length
        Dim dataStream As Stream = request.GetRequestStream
        dataStream.Write(byteArray, 0, byteArray.Length)
        dataStream.Close()

知道如何正确解析我的 JSON 对象并发送多个通知吗?任何帮助将不胜感激。

问候

4

1 回答 1

6

JSON 应如下所示:

{
  "registration_ids" : ["APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",...],
  "data" : {
    "Team" : "Portugal",
    "Score" : "3",
    "Player" : "Varela",
  },
}

您忘记为数据创建字典。

来自 GCM 文档:

数据
一个 JSON 对象,其字段表示消息有效负载数据的键值对。如果存在,有效负载数据将作为应用程序数据包含在 Intent 中,键是额外的名称。例如,"data":{"score":"3x1"} 将导致一个意图额外命名的分数,其值为字符串 3x1。键/值对的数量没有限制,但消息的总大小(4kb)有限制。这些值可以是任何 JSON 对象,但我们建议使用字符串,因为无论如何这些值都会在 GCM 服务器中转换为字符串。如果要包含对象或其他非字符串数据类型(如整数或布尔值),则必须自己转换为字符串。另请注意,密钥不能是保留字(from 或任何以 google. 开头的单词)。让事情稍微复杂一点的是,在有效载荷数据中技术上允许使用一些保留字(例如 collapse_key)。但是,如果请求中还包含该单词,则请求中的值将覆盖有效负载数据中的值。因此,即使在技术上允许的情况下,也不建议使用在此表中定义为字段名称的词。可选的。即使在技术上允许的情况下。可选的。即使在技术上允许的情况下。可选的。

于 2013-02-15T16:11:48.917 回答