Loa*_*oai 5 c# android push-notification google-cloud-messaging
我正在尝试通过推送通知通知设备
我收到了来自GCM服务器的回复
{"multicast_id":8594338261894783737,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1355822022916886%8ae6056ef9fd7ecd"}]}
但仍然没有收到通知
有了知识--> "success":1
但我认为这里有问题 --> "canonical_ids":0
这是我的代码...
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";
}
Run Code Online (Sandbox Code Playgroud)
我调用这个方法使用
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);
Run Code Online (Sandbox Code Playgroud)
提前致谢
查看 GCM 文档中的响应格式:http://developer.android.com/google/gcm/gcm.html#response
success Number of messages that were processed without an error.
Run Code Online (Sandbox Code Playgroud)
我理解这意味着 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() 方法中。
| 归档时间: |
|
| 查看次数: |
8764 次 |
| 最近记录: |