GCM响应为:错误=未注册。

5
这是我为 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开发者指南中甚至没有提到这个响应。那么我为什么会收到这个响应呢?有人能帮我解决吗?先谢谢了。

2个回答

7

我已经找到了发生这种情况的原因。有六种类型的响应。以下是响应列表及其含义。

{ "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的信息。使用新的发送者ID、注册ID和API密钥后,以上代码可以正常工作。

我收到了“InvalidRegistration”的响应,这是什么原因? - ramya

3

虽然我不是服务器专业人员,但最近审查了GCM服务器代码以解决问题。以下是我的发现:

您的设置API密钥的代码行:

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

我觉得这看起来不对。应该将key=关键字连接到API密钥上,然后你的代码行应该是这样的:

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

这是在我的端口上运行的解决方案。

对于发送者 ID,我们有一种不同的方法,请检查您的代码中的此行:

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

2
这些代码行不会产生完全相同的字符串吗?据我所见,key={0}将在等号后面紧跟着ApiKey。 - spacediver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接