5

Este es mi servidor de muestra creado para GCM.La respuesta de GCM es: Error = No registrado

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; 
    } 
} 

Después de ejecutarlo con estos valores válidos y claves, recibí esta respuesta.

Please wait while GCM server is processing... 

SendMessage Response: Error=NotRegistered 

Estoy recibiendo Error=NotRegistered. Esta respuesta ni siquiera está especificada en la guía para desarrolladores de Android. ¿Cuál debería ser el motivo por el que recibo esta respuesta? ¿Puede alguien ayudarme con esto? Gracias por adelantado.

Respuesta

7

he descubierto la razón por la que estaba pasando. Podría haber seis tipos de respuestas. A continuación está la lista de respuestas y su significado.

{ "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 

que estaba recibiendo el mensaje de error 6. Con el nuevo ID del remitente, ID de registro y la clave de API mi código está trabajando.

+0

recibo una respuesta Respuesta 'InvalidRegistration', ¿cuál sería el motivo? – yadavr

3

No soy el tipo del servidor, pero recientemente revisé el código del servidor de GCM para resolver el problema. Así que aquí lo que encontré:

Su línea de código para configurar la clave de API:

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

no se ve bien para mí. La clave = palabra debe ser concatenado con la clave de API y su línea se vería así:

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

Eso es lo que ha funcionado en mi extremo.

y para la ID del remitente que tienen un enfoque diferente, a fin de comprobar su esta línea de código también:

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

¿Estas líneas no producirían exactamente la misma cadena como resultado? Por lo que puedo ver, 'key = {0}' pondrá ApiKey justo después de '='. – spacediver

Cuestiones relacionadas