A resposta do GCM que vem é:Erro=Não registrado
-
12-12-2019 - |
Pergunta
Este é meu servidor de amostra criado para 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() + "®istration_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;
}
}
Depois de executá-lo com esses valores e chaves válidos, recebi esta resposta.
Please wait while GCM server is processing...
SendMessage Response: Error=NotRegistered
estou obtendo Error=NotRegistered
.Esta resposta nem está especificada no guia do desenvolvedor Android.Qual deve ser a razão pela qual estou recebendo esta resposta?Alguém pode me ajudar com isso?Desde já, obrigado.
Solução
Eu descobri o motivo pelo qual isso estava acontecendo.Pode haver seis tipos de respostas.A seguir está a lista de respostas e seu 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
Eu estava recebendo a mensagem de erro 6.Com o novo ID do remetente, ID de registro e chave de API, meu código acima está funcionando.
Outras dicas
Não sou o servidor, mas recentemente examinei o código do servidor GCM para resolver o problema.Então aqui está o que encontrei:
Sua linha de código para definir a chave API:
Request.Headers.Add(string.Format("Authorization: key={0}", ApiKey));
Não parece certo para mim.O chave = word deve ser concatenada à chave da API e então sua linha ficaria assim:
Request.Headers.Add("Authorization", "key=" + ApiKey));
Foi isso que funcionou do meu lado.
e para o ID do remetente temos uma abordagem diferente, então verifique também esta linha de código:
Request.Headers.Add(string.Format("Sender: id={0}", SenderId));