5

I am trying to Notify the Device by the Push Notification

I Received this Response From THE GCM Server

{"multicast_id":8594338261894783737,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1355822022916886%8ae6056ef9fd7ecd"}]}

But Still Not get the Notification

With Knowledge That --> "success":1

But I Think there is something Wrong Here --> "canonical_ids":0


This Is My Code ...

 private string SendGCMNotification(string apiKey, string postData, string postDataContentType = "application/json")
 {
     ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateServerCertificate);

     //
     //  MESSAGE CONTENT
     byte[] byteArray = Encoding.UTF8.GetBytes(postData);

     //
     //  CREATE REQUEST
     HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://android.googleapis.com/gcm/send");
     Request.Method = "POST";
     Request.KeepAlive = false;
     Request.ContentType = postDataContentType;
     Request.Headers.Add(HttpRequestHeader.Authorization, string.Format("key={0}",apiKey));
     Request.ContentLength = byteArray.Length;

     Stream dataStream = Request.GetRequestStream();
     dataStream.Write(byteArray, 0, byteArray.Length);
     dataStream.Close();

     try
     {
         WebResponse Response = Request.GetResponse();
         HttpStatusCode ResponseCode = ((HttpWebResponse)Response).StatusCode;
         if (ResponseCode.Equals(HttpStatusCode.Unauthorized) || ResponseCode.Equals(HttpStatusCode.Forbidden))
         {
          Label1.Text = "Unauthorized - need new token";

         }
         else if (!ResponseCode.Equals(HttpStatusCode.OK))
         {
             Label1.Text = "Response from web service isn't OK";
         }

         StreamReader Reader = new StreamReader(Response.GetResponseStream());
         string responseLine = Reader.ReadToEnd();
         Reader.Close();

         return responseLine;
     }
     catch (Exception e)
     {
         return "error";
     }
    // return "error";
 }

and i call this method using

     string deviceId = "APA91bHomX3zb6Y87fb4GAjyj8zIaI-tt1n6ZFmgtmu16nmLW7ntwnOyv4BXMH7RzQWk3JrKdLjttJMxKzvpFd3Kmrid_RzsC3zR46GLJGiZKERXOSIR8fYReBEfz1f0G_FIm5bPttWUBDwz9jPuF2lS8RQh-0DKbw";
     string message = "some test message";
     string tickerText = "example test GCM";
     string contentTitle = "content title GCM";
     string postData =
     "{ \"registration_ids\": [ \"" + deviceId + "\" ], " +
       "\"data\": {\"tickerText\":\"" + tickerText + "\", " +
                  "\"contentTitle\":\"" + contentTitle + "\", " +
                  "\"message\": \"" + message + "\"}}";

     Label1.Text = SendGCMNotification("AIzaSyBEvtrtbbfy2-p2zS8Zi8DweZiRy8M-nZc", postData);

Thanks In Advance

4

1 回答 1

2

查看 GCM 文档中的响应格式:http: //developer.android.com/google/gcm/gcm.html#response

success     Number of messages that were processed without an error.

我理解这意味着 GCM 能够处理该消息,这并不意味着该消息已成功发送到设备。(例如,设备可能离线,稍后会收到,但消息已成功处理)。

"canonical_ids":0 并不意味着有错误,这意味着没有需要更新其 ID 的设备。您可以在此处阅读有关规范 ID 的更多信息:http: //developer.android.com/google/gcm/adv.html#canonical

在服务器端,只要应用程序运行良好,一切都应该正常工作。但是,如果应用程序中的错误触发同一设备的多个注册,则可能很难协调状态,并且您最终可能会收到重复的消息。

GCM 提供了一种称为“规范注册 ID”的工具,可以轻松地从这些情况中恢复。规范注册 ID 定义为您的应用程序请求的最后一次注册的 ID。这是服务器在向设备发送消息时应使用的 ID。

如果稍后您尝试使用不同的注册 ID 发送消息,GCM 将照常处理请求,但它将在响应的 registration_id 字段中包含规范注册 ID。确保使用此规范 ID 替换存储在您服务器中的注册 ID,因为最终您使用的 ID 将停止工作。

我建议向您的客户端添加一些日志记录代码,以确保您没有收到该消息。特别是在您的 GCMIntentService 类的 onMessage() 方法中。

于 2012-12-19T20:53:58.850 回答