2012-06-29 12 views

Respuesta

3

Hace un tiempo que había estado jugando con C2DM para enviar notificaciones automáticas. Alteré mi código de acuerdo con los cambios mencionados en esta página: http://developer.android.com/guide/google/gcm/c2dm.html#server hacer uso de 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 le requiere para la autenticación en 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 ayudarle a conseguir su clave de API configurar: http://developer.android.com/guide/google/gcm/gs.html

El código para mi forma de la tela está por debajo 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 para Android a la recepción de las notificaciones push, echa un vistazo este enlace: http://developer.android.com/guide/google/gcm/gs.html#android-app

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

+0

Hola Zishan, gracias por la respuesta. Ha publicado un código que se implementó mediante el servicio C2DM. –

+0

Hola, ¿hay alguna línea de muestra o gudie disponible para implementar Google Cloud Messaging (GCM) utilizando la aplicación Asp.Net? –

+0

Hola, hay alguna solución disponible en Asp.net igual que: http://developer.android.com/guide/google/gcm/demo.html –

7

Este es 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(); 
0

Nikunj Ganatra, puede una vez que echa un vistazo a este enlace para su tipo de error, tal vez su ID de aplicación sería erróneo u otros detalles pueden ser incorrectos .. http://developer.android.com/guide/google/gcm/gcm.html#top

Response/Description

200 Message was processed successfully. The response body will contain more details about the message status, but its format will depend whether the request was JSON or plain text. See Interpreting a success response for more details.

400 Only applies for JSON requests. Indicates that the request could not be parsed as JSON, or it contained invalid fields (for instance, passing a string where a number was expected). The exact failure reason is described in the response and the problem should be addressed before the request can be retried.

401 There was an error authenticating the sender account.

500 There was an internal error in the GCM server while trying to process the request.

503 Indicates that the server is temporarily unavailable (i.e., because of timeouts, etc). Sender must retry later, honoring any Retry-After header included in the response. Application servers must implement exponential back-off. The GCM server took too long to process the request.

Acabo de rectificarlo.

9

que tienen una porción de código que está trabajando muy bien para mí y puedan ser de utilidad, he comprobado ...

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

Probé muchos códigos diff disponibles para enviar mensajes de inserción de GCM ... y solo este funciona a la perfección ... Otros códigos funcionaban pero recibía notificación de inserción con mensaje en blanco ... – hriziya

+0

¿cómo enviar múltiples regimientos a GCM? cómo enviar mensajes de texto en lugar de "recibiste un mensaje". – Tej

+2

¿Qué es GoogleAppID? ¿Es la clave API o el nombre del paquete? – Jacek

2

manera JSON

user1551788 respuesta 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 lo mismo que la documentación requiere, comprobar las diferentes solicitudes usted puede hacer here

Una breve descripción:

a: el teléfono para enviar a, insertar el registrationId que recibió del teléfono aquí. delay_while_idle Al utilizar la marca de delay_while_idle, las notificaciones se enviarán una vez que el dispositivo se active. (fuera de bloqueo, cuando el usuario realmente usa el teléfono).

datos: configure data con pares de clave/valor personalizados para pasar carga adicional a la aplicación del 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 he usado.

collapse_key: Si se activa, una notificación de que tiene el mismo nombre collapse_key debe sobrescribir la notificación de más edad (metter de buena ejecución en el lado del teléfono cuando la notificación se envía, en el servidor de GCM se sobrescribe cuando la notificación es pendiente).

time_to_live: Adelante, cuánto durará la notificación, actualmente no es compatible con IOS.

Alguna otra, 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; } 
    } 

de usar, basta:

//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, que indica cuántos tuvieron éxito y cuántos fracasaron, etc.

Cuestiones relacionadas