Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo enviar notificaciones push de Android a través de GCM en C # .Net

Soy nuevo en todas las notificaciones push de Android GCM y he leído posts de pila pero no pude obtener una respuesta directa. También he leído Create push notification en android para obtener una mejor comprensión de cómo funciona GCM. También he utilizado el servidor gcm-demo y gcm-demo-client proporcionado por el SDK. Sin embargo, aquí están mis dudas y lo que he intentado hasta ahora:

  1. En cuanto al enlace que he puesto, el teléfono que tiene la aplicación registra para obtener la clave de registro. ¿Es esta una clave única para todos los teléfonos que utilizan la misma aplicación?
  2. ¿Esta clave de registro caduca en cualquier caso? (Por ejemplo, la aplicación se ejecuta en el fondo)
  3. Asumiendo que tengo la clave de registro, he probado el siguiente fragmento de código para enviar notificación a través de GCM a mi aplicación. Esto está escrito en c # .net. Por favor, hágamelo saber si lo que he mencionado anteriormente se puede lograr mediante el siguiente fragmento de código:

    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(string.Format("Authorization: key={0}", apiKey)); Request.ContentLength = byteArray.Length; Stream dataStream = Request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); // SEND MESSAGE try { WebResponse Response = Request.GetResponse(); HttpStatusCode ResponseCode = ((HttpWebResponse)Response).StatusCode; if (ResponseCode.Equals(HttpStatusCode.Unauthorized) || ResponseCode.Equals(HttpStatusCode.Forbidden)) { var text = "Unauthorized - need new token"; } else if (!ResponseCode.Equals(HttpStatusCode.OK)) { var 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"; } 
  4. ¿Existe una forma directa de enviar notificaciones push sin que el teléfono se registre por primera vez en nuestro servidor personalizado?

5 Solutions collect form web for “Cómo enviar notificaciones push de Android a través de GCM en C # .Net”

Refiera el código:

 public class AndroidGCMPushNotification { public AndroidGCMPushNotification() { // // TODO: Add constructor logic here // } public string SendNotification(string deviceId, string message) { string SERVER_API_KEY = "server api key"; var SENDER_ID = "application number"; var value = message; WebRequest tRequest; tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send"); tRequest.Method = "post"; tRequest.ContentType = " application/x-www-form-urlencoded;charset=UTF-8"; tRequest.Headers.Add(string.Format("Authorization: key={0}", SERVER_API_KEY)); tRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID)); string postData = "collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.message=" + value + "&data.time=" + System.DateTime.Now.ToString() + "&registration_id=" + deviceId + ""; Console.WriteLine(postData); Byte[] byteArray = Encoding.UTF8.GetBytes(postData); tRequest.ContentLength = byteArray.Length; Stream dataStream = tRequest.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); WebResponse tResponse = tRequest.GetResponse(); dataStream = tResponse.GetResponseStream(); StreamReader tReader = new StreamReader(dataStream); String sResponseFromServer = tReader.ReadToEnd(); tReader.Close(); dataStream.Close(); tResponse.Close(); return sResponseFromServer; } } 

Enlace de Referencia:

http://www.codeproject.com/Tips/434338/Android-GCM-Push-Notification

El código parece un poco largo, pero funciona. Acabo de enviar una notificación de empuje a mi teléfono después de luchar 2 días mediante la implementación del código siguiente en el proyecto C #. Hice referencia a un enlace en relación con esta implementación, pero no pude encontrarlo para publicar aquí. Así que compartiré mi código contigo. Si desea probar la notificación en línea, puede visitar este enlace .

Nota: Tengo hardcorded apiKey, deviceId y postData, por favor pase la apiKey, deviceId y postData en su solicitud y eliminarlos del cuerpo del método. Si desea pasar cadena de mensajes también

 public string SendGCMNotification(string apiKey, string deviceId, string postData) { string postDataContentType = "application/json"; apiKey = "AIzaSyC13...PhtPvBj1Blihv_J4"; // hardcorded deviceId = "da5azdfZ0hc:APA91bGM...t8uH"; // hardcorded string message = "Your text"; string tickerText = "example test GCM"; string contentTitle = "content title GCM"; postData = "{ \"registration_ids\": [ \"" + deviceId + "\" ], " + "\"data\": {\"tickerText\":\"" + tickerText + "\", " + "\"contentTitle\":\"" + contentTitle + "\", " + "\"message\": \"" + message + "\"}}"; 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(string.Format("Authorization: key={0}", apiKey)); Request.ContentLength = byteArray.Length; Stream dataStream = Request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); // // SEND MESSAGE try { WebResponse Response = Request.GetResponse(); HttpStatusCode ResponseCode = ((HttpWebResponse)Response).StatusCode; if (ResponseCode.Equals(HttpStatusCode.Unauthorized) || ResponseCode.Equals(HttpStatusCode.Forbidden)) { var text = "Unauthorized - need new token"; } else if (!ResponseCode.Equals(HttpStatusCode.OK)) { var 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"; } public static bool ValidateServerCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; } 

Es posible que no esté familiarizado con palabras como apiKey, deviceId. No te preocupes voy a explicar lo que son y cómo crear esos.

Clave API
Qué y por qué: Esta es una clave que se utilizará al enviar solicitudes al servidor GCM.
Cómo crear: Referir esta publicación

ID del dispositivo
Qué y por qué: Este id también conocido como RegistrationId. Este es un identificador único para identificar el dispositivo. Cuando desee enviar una notificación a un dispositivo específico, necesitará este id.
Cómo crear: Esto depende de cómo implementar la aplicación. Para cordova he utilizado un simple plugin pushNotification Usted puede simplemente crear un deviceId / RegistrationId utilizando este complemento. Para hacer eso usted necesita tener un senderId . Google cómo crear un senderId es realmente simple =)

Si alguien necesita alguna ayuda deja un comentario.

Codificación feliz.
-Charitha-

Sólo para la información de los nuevos visitantes en este post, si desea enviar el mismo mensaje a varios dispositivos, simplemente envíe un identificador de dispositivo separado por coma en el parámetro registration_id de la solicitud.

Aquí hay un buen artículo sobre este http://www.codewithasp.net/2015/11/send-message-gcm-c-sharp-single-multiple.html

Esto nunca funcionó para mí y es difícil de depurar más pasando una lista de token de registro no es claro – se espera pasar una serie de cadena en lugar de una cadena separada por comas -, el hecho de que esto es muy simple post solicitud he creado mi propia clase con Un método que devuelve la respuesta del servidor, y funciona muy bien:

Uso

  //Registration Token string[] registrationIds ={"diks4vp5......","erPjEb9....."}; AndroidGcmPushNotification gcmPushNotification = new AndroidGcmPushNotification( "API KEY", registrationIds, "Hello World" ); gcmPushNotification.SendGcmNotification(); 

Clase

 using System; using System.IO; using System.Net; using System.Text; using System.Web.Script.Serialization; public class AndroidGcmPushNotification { private readonly string _apiAccessKey; private readonly string[] _registrationIds; private readonly string _message; private readonly string _title; private readonly string _subtitle; private readonly string _tickerText; private readonly bool _vibrate; private readonly bool _sound; public AndroidGcmPushNotification(string apiAccessKey, string[] registrationIds, string message, string title = "", string subtitle = "", string tickerText = "", bool vibrate = true, bool sound = true ) { _apiAccessKey = apiAccessKey; _registrationIds = registrationIds; _message = message; _title = title; _subtitle = subtitle; _tickerText = tickerText; _vibrate = vibrate; _sound = sound; } public string SendGcmNotification() { //MESSAGE DATA GcmPostData data = new GcmPostData() { message = _message, title = _title, subtitle = _subtitle, tickerText = _tickerText, vibrate = _vibrate, sound = _sound }; //MESSAGE FIELDS GcmPostFields fields = new GcmPostFields(); fields.registration_ids = _registrationIds; fields.data = data; //SERIALIZE TO JSON JavaScriptSerializer jsonEncode = new JavaScriptSerializer(); //CONTENTS byte[] byteArray = Encoding.UTF8.GetBytes(jsonEncode.Serialize(fields)); //REQUEST HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://android.googleapis.com/gcm/send"); request.Method = "POST"; request.KeepAlive = false; request.ContentType = "application/json"; request.Headers.Add($"Authorization: key={_apiAccessKey}"); request.ContentLength = byteArray.Length; Stream dataStream = request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); //SEND REQUEST try { WebResponse response = request.GetResponse(); { StreamReader reader = new StreamReader(response.GetResponseStream()); string responseLine = reader.ReadToEnd(); reader.Close(); return responseLine; } } catch (Exception e) { return e.Message; } } private class GcmPostFields { public string[] registration_ids { get; set; } public GcmPostData data { get; set; } } private class GcmPostData { public string message { get; set; } public string title { get; set; } public string subtitle { get; set; } public string tickerText { get; set; } public bool vibrate { get; set; } public bool sound { get; set; } } } 

Hay paquete PushSharp . Permite comunicarse con casi todos los api de notificación popular.

Ejemplo de código:

 // Configuration var config = new GcmConfiguration ("GCM-SENDER-ID", "AUTH-TOKEN", null); // Create a new broker var gcmBroker = new GcmServiceBroker (config); // Wire up events gcmBroker.OnNotificationFailed += (notification, aggregateEx) => { aggregateEx.Handle (ex => { // See what kind of exception it was to further diagnose if (ex is GcmNotificationException) { var notificationException = (GcmNotificationException)ex; // Deal with the failed notification var gcmNotification = notificationException.Notification; var description = notificationException.Description; Console.WriteLine ($"GCM Notification Failed: ID={gcmNotification.MessageId}, Desc={description}"); } else if (ex is GcmMulticastResultException) { var multicastException = (GcmMulticastResultException)ex; foreach (var succeededNotification in multicastException.Succeeded) { Console.WriteLine ($"GCM Notification Failed: ID={succeededNotification.MessageId}"); } foreach (var failedKvp in multicastException.Failed) { var n = failedKvp.Key; var e = failedKvp.Value; Console.WriteLine ($"GCM Notification Failed: ID={n.MessageId}, Desc={e.Description}"); } } else if (ex is DeviceSubscriptionExpiredException) { var expiredException = (DeviceSubscriptionExpiredException)ex; var oldId = expiredException.OldSubscriptionId; var newId = expiredException.NewSubscriptionId; Console.WriteLine ($"Device RegistrationId Expired: {oldId}"); if (!string.IsNullOrWhitespace (newId)) { // If this value isn't null, our subscription changed and we should update our database Console.WriteLine ($"Device RegistrationId Changed To: {newId}"); } } else if (ex is RetryAfterException) { var retryException = (RetryAfterException)ex; // If you get rate limited, you should stop sending messages until after the RetryAfterUtc date Console.WriteLine ($"GCM Rate Limited, don't send more until after {retryException.RetryAfterUtc}"); } else { Console.WriteLine ("GCM Notification Failed for some unknown reason"); } // Mark it as handled return true; }); }; gcmBroker.OnNotificationSucceeded += (notification) => { Console.WriteLine ("GCM Notification Sent!"); }; // Start the broker gcmBroker.Start (); foreach (var regId in MY_REGISTRATION_IDS) { // Queue a notification to send gcmBroker.QueueNotification (new GcmNotification { RegistrationIds = new List<string> { regId }, Data = JObject.Parse ("{ \"somekey\" : \"somevalue\" }") }); } // Stop the broker, wait for it to finish // This isn't done after every message, but after you're // done with the broker gcmBroker.Stop (); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.