5

Bu, GCM için oluşturulan örnek sunucum.GCM yanıtı geliyor: Hata = NotRegistered

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

Bu geçerli değerler ve anahtarlarla çalıştırdıktan sonra bu yanıtı aldım.

Please wait while GCM server is processing... 

SendMessage Response: Error=NotRegistered 

Error=NotRegistered alıyorum. Bu yanıt, android geliştirici kılavuzunda bile belirtilmemiştir. Bu cevabı almamın nedeni ne olmalı? Bu konuda bana yardımcı olan var mı? Şimdiden teşekkürler.

cevap

7

. Altı tip cevap olabilir. Aşağıdaki cevap listesi ve anlamları.

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

Hata iletisi alıyordum 6. Yeni Gönderen Kimliği, Kayıt Kimliği ve API anahtarı ile yukarıdaki kodum çalışıyor.

+0

'InvalidRegistration' yanıtı alıyorum, sebebi ne olurdu? – yadavr

3

Sunucu kullanıcısı değilim, ancak bu sorunu gidermek için kısa bir süre önce GCM sunucu kodunu inceledim. Yani burada ne buldum:

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

bana doğru görünmüyor: kodunun

Satır API Anahtarını ayarlayın. anahtar = kelime api anahtarı birleştirilmelidir ve ardından satır şu şekilde görünecektir:

benim sonunda çalıştı ne
Request.Headers.Add("Authorization", "key=" + ApiKey)); 

.

ve gönderen kimliği için

biz farklı bir yaklaşım var, bu yüzden de kod sizin bu satırı kontrol edin: Ben o oluyordu nedenini öğrendim

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

Bu satırlar, sonuçta tam olarak aynı dizeyi üretmez mi? Görebildiğim kadarıyla, anahtar = {0} 'ApiKey'i hemen sonra = =' a getirecektir. – spacediver