Ответ GCM: Ошибка = NotRegistered

Это мой примерный сервер, созданный для GCM.

class Program2 { public static string SenderId = "318115091714"; public static string RegistrationID = "APA91bF9hn6VeessobraNuauBcrFdlJ9eH1eVb44FAQ2oawerBeFWS48IEIFTPo8fdvWm93hwFY0tKszpPuSObPbTqgW-za1RLhCw-GDCn4JQZLQ-CmGwnnr6F5X8gYhNa2DNvFhCEM7HNgvdxtcnBqVX0dVnEynXQ"; public static string ApiKey = "AIzaSyAl2HdB4bbukkcmJwoxUmhof15IAiuJ16U"; public static string Message = "Testing GCM Server"; public static string ApplicationId = "com.google.android.gcm.demo.app"; /// <summary> /// Main method /// </summary> public static void Main(string[] args) { try { Program2 objProgram2 = new Program2(); Console.WriteLine("\nPlease wait while GCM server is processing..."); string Text = objProgram2.SendMessage(); Console.WriteLine("\nSendMessage Response: " + Text); Console.ReadLine(); } catch (Exception ex) { Console.WriteLine("\n" + ex.Message); Console.WriteLine("\n" + ex.StackTrace); Console.ReadLine(); } } /// <summary> /// Send Push Message to Device /// </summary> public string SendMessage() { //-- Create Query String --// string postData = "collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.Message=" + Message + "&data.time=" + System.DateTime.Now.ToString() + "&registration_id=" + RegistrationID + ""; //Console.WriteLine(postData); Byte[] byteArray = Encoding.UTF8.GetBytes(postData); //-- Create GCM Request Object --// HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://android.googleapis.com/gcm/send"); Request.Method = "POST"; Request.KeepAlive = false; Request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8"; Request.Headers.Add(string.Format("Authorization: key={0}", ApiKey)); Request.Headers.Add(string.Format("Sender: id={0}", SenderId)); Request.ContentLength = byteArray.Length; //-- Delegate Modeling to Validate Server Certificate --// ServicePointManager.ServerCertificateValidationCallback += delegate( object sender, System.Security.Cryptography.X509Certificates.X509Certificate pCertificate, System.Security.Cryptography.X509Certificates.X509Chain pChain, System.Net.Security.SslPolicyErrors pSSLPolicyErrors) { return true; }; //-- Create Stream to Write Byte Array --// Stream dataStream = Request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); //-- Post a Message --// WebResponse Response = Request.GetResponse(); HttpStatusCode ResponseCode = ((HttpWebResponse)Response).StatusCode; if (ResponseCode.Equals(HttpStatusCode.Unauthorized) || ResponseCode.Equals(HttpStatusCode.Forbidden)) { return "Unauthorized - need new token"; } else if (!ResponseCode.Equals(HttpStatusCode.OK)) { return "Response from web service isn't OK"; //Console.WriteLine("Response from web service is not OK :"); //Console.WriteLine(((HttpWebResponse)Response).StatusDescription); } StreamReader Reader = new StreamReader(Response.GetResponseStream()); string responseLine = Reader.ReadLine(); Reader.Close(); return responseLine; } } 

После запуска с этими действительными значениями и ключами я получил этот ответ.

 Please wait while GCM server is processing... SendMessage Response: Error=NotRegistered 

Я получаю Error=NotRegistered . Этот ответ даже не указан в руководстве разработчика Android. Какова должна быть причина, по которой я получаю этот ответ? Может ли кто-нибудь помочь мне с этим? Заранее спасибо.

Я выяснил причину, почему это происходит. Может быть шесть ответов. Ниже приведен список ответов и их смысл.

 { "message_id": "1:0408" } - success { "error": "Unavailable" } - should be resent { "error": "InvalidRegistration" } - had an unrecoverable error (maybe the value got corrupted in the database) { "message_id": "1:1516" } - success { "message_id": "1:2342", "registration_id": "32" } - success, but the registration ID should be updated in the server database { "error": "NotRegistered"} - registration ID should be removed from the server database because the application was uninstalled from the device 

Я получил сообщение об ошибке 6. С новым идентификатором отправителя, регистрационным идентификатором и ключом API мой выше код работает.

Я не серверный парень, но недавно просмотрел код сервера GCM, чтобы решить проблему. Итак, вот что я нашел:

Ваша строка кода для установки ключа API:

 Request.Headers.Add(string.Format("Authorization: key={0}", ApiKey)); 

Не подходит мне. Ключ = слово должен быть объединен с ключом api, а затем ваша строка будет выглядеть так:

 Request.Headers.Add("Authorization", "key=" + ApiKey)); 

Это то, что сработало с моей стороны.

И для идентификатора отправителя у нас есть другой подход, поэтому также проверьте свою строку:

 Request.Headers.Add(string.Format("Sender: id={0}", SenderId));