Notificación de GCM Push con Asp.Net

Como puede haber visto, Google está migrando su sistema de notificación push.

http://developer.android.com/guide/google/gcm/c2dm.html

¿Hay alguna muestra o línea de guía disponible para implementar Google Cloud Messaging (GCM) utilizando una aplicación Asp.Net?

Tengo un código que funciona bien para mí y podría ser útil, lo probé …

void send(string regId) { var applicationID = "xxxxxxxx"; var SENDER_ID = "xxxxx"; var value = txtMsg.Text; 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}", applicationID)); tRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID)); // string postData = "{ 'registration_id': [ '" + regId + "' ], 'data': {'message': '" + txtMsg.Text + "'}}"; 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=" + regId + ""; 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(); lblStat.Text = sResponseFromServer; tReader.Close(); dataStream.Close(); tResponse.Close(); } 

aquí está el código en c #

  WebRequest tRequest; tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send"); tRequest.Method = "post"; tRequest.ContentType = "application/x-www-form-urlencoded"; tRequest.Headers.Add(string.Format("Authorization: key={0}", GoogleAppID)); String collaspeKey = Guid.NewGuid().ToString("n"); String postData=string.Format("registration_id={0}&data.payload={1}&collapse_key={2}", DeviceID, "Pickup Message" + DateTime.Now.ToString(), collaspeKey); 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(); 

Hace un tiempo que había estado jugando con C2DM para enviar notificaciones automáticas. Modifiqué mi código de acuerdo con los cambios mencionados en esta página: http://developer.android.com/guide/google/gcm/c2dm.html#server para usar el servicio de GCM:

 Private Sub btnPush_Click(sender As Object, e As System.EventArgs) Handles btnPush.Click lblResponse.Text = SendNotification(AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA) End Sub 

Mi función SendNotification:

 Private Function SendNotification(ByVal authstring As String) As String ServicePointManager.ServerCertificateValidationCallback = Function(sender As Object, certificate As X509Certificate, chain As X509Chain, sslPolicyErrors As SslPolicyErrors) True Dim request As WebRequest = WebRequest.Create("https://android.googleapis.com/gcm/send") request.Method = "POST" request.ContentType = "application/x-www-form-urlencoded" request.Headers.Add(String.Format("Authorization: key={0}", authstring)) Dim collaspeKey As String = Guid.NewGuid().ToString("n") Dim postData As String = String.Format("registration_id={0}&data.payload={1}&collapse_key={2}", deviceList.SelectedValue, txtPayload.Text, collaspeKey) Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData) request.ContentLength = byteArray.Length Dim dataStream As Stream = request.GetRequestStream() dataStream.Write(byteArray, 0, byteArray.Length) dataStream.Close() Dim response As WebResponse = request.GetResponse() dataStream = response.GetResponseStream() Dim reader As New StreamReader(dataStream) Dim responseFromServer As String = reader.ReadToEnd() reader.Close() dataStream.Close() response.Close() Return responseFromServer End Function 

Parece que GCM no requiere que se autentique contra Google para obtener una clave de autenticación (como fue el caso con C2DM). En cambio, necesitará una clave API que se pasará a la función SendNotification. Esta página debería ayudarlo a configurar su clave API: http://developer.android.com/guide/google/gcm/gs.html

El código para mi formulario web está debajo por si acaso:

 
Eclipse AVD My Phone 1 My Phone 2



En cuanto a la creación de su aplicación Android para recibir notificaciones push, consulte este enlace: http://developer.android.com/guide/google/gcm/gs.html#android-app

No olvide importar System.Net, System.IO, System.Security.Cryptography.X509Certificates y System.Net.Security.

Forma JSON

La respuesta de user1551788 funciona bien, sin embargo, me gusta hacerlo en JSON, que es una mejor práctica en lugar de insertar todo en una línea, creo.

La clase interna ‘jsonObj’ es la misma que requiere la documentación, verifique las diferentes solicitudes que puede hacer aquí

Una breve descripción:

a : el teléfono para enviar, inserte aquí el ID de registro que recibió del teléfono. delay_while_idle Al utilizar el indicador delay_while_idle, las notificaciones se enviarán una vez que el dispositivo se active. (fuera de locking, cuando el usuario realmente usa el teléfono).

datos : establezca data con pares clave / valor personalizados para pasar carga adicional a la aplicación cliente. Entonces, puede poner cualquier variable que desee, si le gusta una cadena json que contiene otro objeto, siempre que no exceda los 4 KB.

Algunos que también están disponibles y que no usé.

collapse_key : si se establece, una notificación que tenga el mismo nombre de colapso_key debe sobrescribirse a la anterior (medida de buena implementación en el lado del teléfono cuando se envía la notificación, en el servidor GCM sobrescribirá cuando la notificación esté pendiente).

time_to_live : En línea recta, por cuánto tiempo la notificación permanecerá activa, actualmente no es compatible con IOS.

Algunos otros, vea la documentación.

clase interna porque no necesitaba ese objeto fuera de mi clase, lo cual es mejor para nombrar como ‘datos’ que podría ser cualquier cosa.

 private void SendPostsToGCM(jsonObj jsonObj) { string senderId = "your project number (google)"; string apiKey = "your apiKey, found on console"; WebRequest tRequest; tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send"); tRequest.Method = "post"; tRequest.ContentType = "application/json"; tRequest.Headers.Add(string.Format("Authorization: key={0}", apiKey)); tRequest.Headers.Add(string.Format("Sender: id={0}", senderId)); string jsonPostData = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj); //download Newtonsoft NuGet package Byte[] byteArray = Encoding.UTF8.GetBytes(jsonPostData); 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(); string response = sResponseFromServer; tReader.Close(); dataStream.Close(); tResponse.Close(); } internal class jsonObj { public bool delay_while_idle { get; set; } public data data { get; set; } public string to { get; set; } } internal class data { public int Id { get; set; } public string text { get; set; } } 

Para usar, simplemente:

  //some filtering to select some posts or whatever. jsonObj jsonPostData = new jsonObj() { delay_while_idle = true, to = registrationGCMid, data = new data() { Id = post.id, text = post.text, } }; SendPostsToGCM(jsonPostData); 

Otra gran diferencia que he notado, el servicio de google devuelve una cadena json que contiene información útil, dice cuántos tuvieron éxito y cuántos fallaron, etc.

Nikunj Ganatra, una vez que revises este enlace para ver tu tipo de error, tal vez tu identificación de la aplicación sea incorrecta u otros detalles puedan ser incorrectos. http://developer.android.com/guide/google/gcm/gcm.html# parte superior

Respuesta / Descripción

200 Mensaje fue procesado con éxito. El cuerpo de respuesta contendrá más detalles sobre el estado del mensaje, pero su formato dependerá de si la solicitud fue JSON o texto sin formato. Consulte Interpretación de una respuesta de éxito para obtener más detalles.

400 Solo se aplica a las solicitudes JSON. Indica que la solicitud no se pudo analizar como JSON o que contenía campos no válidos (por ejemplo, pasar una cadena donde se esperaba un número). El motivo exacto de la falla se describe en la respuesta y el problema debe abordarse antes de poder volver a intentar la solicitud.

401 Hubo un error al autenticar la cuenta del remitente.

500 Hubo un error interno en el servidor de GCM al intentar procesar la solicitud.

503 Indica que el servidor no está disponible temporalmente (es decir, debido a tiempos de espera, etc.). El remitente debe volver a intentarlo más tarde, respetando cualquier encabezado de Reintentar-Después incluido en la respuesta. Los servidores de aplicaciones deben implementar un retroceso exponencial. El servidor de GCM tardó demasiado en procesar la solicitud.

Lo acabo de rectificar.