5

これはGCM用に作成されたサンプルサーバーです。GCM応答は次のようになります。Error = 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; 
    } 
} 

これらの有効な値とキーでそれを実行した後、私はこの応答を受け取りました。

Please wait while GCM server is processing... 

SendMessage Response: Error=NotRegistered 

私はError=NotRegisteredを取得しています。この応答は、アンドロイドの開発者ガイドでも指定されていません。私はこの応答を得ている理由は何でしょうか?誰もがこれで私を助けることができますか?前もって感謝します。

答えて

7

を、私はそれが起こった理由を見出しました。 6種類の回答があります。以下は応答とその意味のリストです。

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

私は新しい送信者ID、登録IDとAPIキー私の上記のコードが動作していると、エラーメッセージ6を得ていました。

+0

私は「InvalidRegistration」レスポンスを受け取っていますが、その理由は何ですか? – yadavr

3

私はサーバー担当者ではありませんが、最近GCMサーバーコードを調べて問題を解決しました。だからここに私が見つけたもの:APIキーを設定するコードの

あなたの行を:

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

は私に右見ていません。 キー=言葉は、APIキーに連結する必要があり、その後、あなたの行は次のようになります

私の最後で働いていたものだ
Request.Headers.Add("Authorization", "key=" + ApiKey)); 

と送信者IDの我々は異なるアプローチを持っているので、あまりにもコードのあなたの次の行を確認してください。

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

これらの行は、結果とまったく同じ文字列を生成しませんか?私が見る限り、 'key = {0}'は '='の直後にApiKeyを置きます。 – spacediver

関連する問題