notification net fcmsharp fcm android asp.net push-notification google-cloud-messaging

android - net - firebase cloud messaging c#



Notificación Push GCM con Asp.Net (5)

Como habrás visto, Google está migrando su sistema de notificaciones push.

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

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


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 había estado jugando con C2DM para enviar notificaciones push. Alteré mi código según los cambios mencionados en esta página: http://developer.android.com/guide/google/gcm/c2dm.html#server para hacer uso del servicio 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 su lugar, necesitará una clave de API que se pasa 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á abajo por si acaso:

<form id="form1" runat="server"> <div> <asp:DropDownList ID="deviceList" runat="server"> <asp:ListItem Value="device-id-goes-here">Eclipse AVD</asp:ListItem> <asp:ListItem Value="device-id-goes-here">My Phone 1</asp:ListItem> <asp:ListItem Value="device-id-goes-here">My Phone 2</asp:ListItem> </asp:DropDownList> <br /><br /> <asp:TextBox ID="txtPayload" runat="server" Width="480px"></asp:TextBox> <br /><br /> <asp:Button ID="btnPush" runat="server" Text="Push" /> <asp:Label ID="lblResponse" runat="server" Text=""></asp:Label> </div> </form>

En cuanto a la creación de su aplicación de Android para recibir las notificaciones push, visite 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.


Nikunj Ganatra, una vez que puedes ver este enlace para ver tu tipo de error, quizás tu ID de aplicación sea incorrecta o otros detalles sean incorrectos .. http://developer.android.com/guide/google/gcm/gcm.html#top

Respuesta / Descripción

200 El mensaje fue procesado exitosamente. El cuerpo de la 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 Interpretar una respuesta de éxito para obtener más detalles.

400 Solo aplica para 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). La razón exacta del fallo se describe en la respuesta y el problema debe resolverse antes de que se pueda volver a intentar la solicitud.

401 Se produjo un error al autenticar la cuenta del remitente.

500 Se produjo un error interno en el servidor GCM al intentar procesar la solicitud.

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

Lo acabo de rectificar.


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


Forma JSON

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

La clase interna ''jsonObj'' es la misma que requiere la documentación, verifique las diferentes solicitudes que puede hacer developers.google.com/cloud-messaging/http

Una breve descripción:

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

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

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

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

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

Algunos otros, ver documentación.

Clase interna porque no necesitaba ese objeto fuera de mi clase, lo que 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 es que el servicio de Google devuelve una cadena json que contiene información útil, indica cuántos han tenido éxito y cuántos han fallado, etc.