web-dev-qa-db-fra.com

Notification push GCM avec Asp.Net

Comme vous l'avez peut-être vu, Google migre son système de notification push.

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

Existe-t-il un exemple ou une ligne guide disponible pour implémenter Google Cloud Messaging (GCM) à l'aide d'une application Asp.Net?

17
Nikunj Ganatra

J'ai un morceau de code qui fonctionne bien pour moi et pourrait être utile, je l'ai testé ...

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

voici le code 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();
7
Steve The Sultan

Il y a quelque temps, je jouais avec C2DM pour envoyer des notifications Push. J'ai modifié mon code selon les changements mentionnés sur cette page: http://developer.Android.com/guide/google/gcm/c2dm.html#server pour utiliser le service GCM:

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

Ma fonction 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

Il semble que GCM ne vous oblige pas à vous authentifier auprès de Google pour obtenir une clé d'authentification (comme c'était le cas avec C2DM). Au lieu de cela, vous aurez besoin d'une clé API qui est transmise à la fonction SendNotification. Cette page devrait vous aider à configurer votre clé API: http://developer.Android.com/guide/google/gcm/gs.html

Le code de mon formulaire Web est ci-dessous au cas où:

<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>

Quant à la création de votre application Android pour recevoir les notifications Push, consultez ce lien: http://developer.Android.com/guide/google/gcm/gs.html# Application Android

N'oubliez pas d'importer System.Net, System.IO, System.Security.Cryptography.X509Certificates et System.Net.Security.

3
Zishan

façon JSON

la réponse de user1551788 fonctionne bien, mais j'aime le faire en JSON, ce qui est une meilleure pratique au lieu d'insérer tout sur une seule ligne, je pense.

La classe interne 'jsonObj' est la même que la documentation l'exige, vérifiez les différentes requêtes que vous pouvez faire ici

Une brève description:

à: le téléphone auquel envoyer, insérez ici l'ID d'enregistrement que vous avez reçu du téléphone. delay_ilst_idle En utilisant l'indicateur delay_ilst_idle, les notifications seront délivrées une fois que l'appareil deviendra actif. (hors verrouillage, lorsque l'utilisateur utilise vraiment le téléphone).

data: définissez data avec des paires clé/valeur personnalisées pour transmettre une charge utile supplémentaire à l'application cliente. Donc, vous pouvez mettre n'importe quelle variable que vous voulez, si vous aimez une chaîne json qui contient un autre objet, tant qu'elle ne dépasse pas 4 Ko.

Certains sont également disponibles que je n'ai pas utilisés.

collapse_key: Si défini, une notification qui a le même collapse_key le nom doit remplacer l'ancienne notification (compteur de bonne implémentation côté téléphone lors de l'envoi de la notification, sur le serveur GCM, il écrasera lorsque la notification est en attente).

time_to_live: Simple, combien de temps la notification restera active, actuellement non prise en charge pour IOS.

Un autre, voir la documentation.

classe interne parce que je n'avais pas besoin de cet objet en dehors de ma classe, ce qui est mieux pour nommer comme "données" qui pourrait être n'importe quoi.

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

Pour utiliser, simplement:

    //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);

Une autre grande différence que j'ai remarquée, le service google renvoie une chaîne json contenant des informations utiles, il indique combien ont réussi et combien ont échoué, etc.

2
CularBytes

Nikunj Ganatra, vous pouvez une fois consulter ce lien pour votre type d'erreur, peut-être que votre identifiant d'application serait faux ou d'autres détails peuvent être incorrects .. http://developer.Android.com/guide/google/gcm/ gcm.html # top

Réponse/Description

200 Le message a été traité avec succès. Le corps de la réponse contiendra plus de détails sur l'état du message, mais son format dépendra du fait que la demande était en JSON ou en texte brut. Voir Interprétation d'une réponse réussie pour plus de détails.

400 S'applique uniquement aux demandes JSON. Indique que la demande n'a pas pu être analysée en tant que JSON ou qu'elle contenait des champs non valides (par exemple, en passant une chaîne là où un nombre était attendu). La raison exacte de l'échec est décrite dans la réponse et le problème doit être résolu avant que la demande puisse être réessayée.

401 Une erreur s'est produite lors de l'authentification du compte de l'expéditeur.

500 Une erreur interne s'est produite sur le serveur GCM lors de la tentative de traitement de la demande.

503 Indique que le serveur est temporairement indisponible (c'est-à-dire en raison de délais d'attente, etc.). L'expéditeur doit réessayer plus tard, en respectant tout en-tête Retry-After inclus dans la réponse. Les serveurs d'applications doivent implémenter un back-off exponentiel. Le serveur GCM a mis trop de temps à traiter la demande.

Je viens de le rectifier.

0
user1528505