5

プッシュ通知でデバイスに通知しようとしています

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

そして私はこのメソッドを使用して呼び出します

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

前もって感謝します

4

1 に答える 1

2

GCMドキュメントの応答形式を確認してください:http://developer.android.com/google/gcm/gcm.html#response

success     Number of messages that were processed without an error.

私が理解しているのは、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()メソッドです。

于 2012-12-19T20:53:58.850 に答える