2012-06-29 15 views

Odpowiedz

3

Jakiś czas temu bawiłem się z C2DM, aby wysyłać powiadomienia push. I zmieniły mojego kodu zgodnie zmian opisanych na tej stronie: http://developer.android.com/guide/google/gcm/c2dm.html#server do wykorzystania na usługi GCM:

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

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

Wydaje się, że GCM nie wymaga uwierzytelnienia przeciwko Google aby uzyskać klucz autoryzacji (tak jak w przypadku C2DM). Zamiast tego będziesz potrzebować klucza API, który jest przekazywany do funkcji SendNotification. Ta strona powinna pomóc Ci klucz API skonfigurować: http://developer.android.com/guide/google/gcm/gs.html

Kod dla mojego formularza internetowego jest poniżej na wszelki wypadek:

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

Co do tworzenia aplikacji na Androida do otrzymywania powiadomień push, sprawdź ten link: http://developer.android.com/guide/google/gcm/gs.html#android-app

Nie zapomnij zaimportować System.Net, System.IO, System.Security.Cryptography.X509Certificates i System.Net.Security.

+0

Cześć Zishan, dzięki za odpowiedź. Użytkownik wysłał kod, który został zaimplementowany przy użyciu usługi C2DM. –

+0

Witam, Czy jest dostępna jakaś próbka lub linia gudie do wdrożenia Google Cloud Messaging (GCM) za pomocą aplikacji Asp.Net? –

+0

Witam, czy istnieje jakieś rozwiązanie dostępne w Asp.net, takie jak: http://developer.android.com/guide/google/gcm/demo.html –

7

oto kod w 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 można raz sprawdzić ten link na swoim rodzaju błędu, może twój id aplikacja będzie źle lub inne dane mogą być nieprawidłowe .. 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.

Właśnie to poprawiłem.

9

Mam kawałek kodu, który działa dobrze dla mnie i może być pomocne, testowałem go ...

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

Próbowałem wielu kodów diff dostępnych dla wysyłania GCM push .. i tylko ten działa idealnie .. Inne kody działały, ale otrzymywałem powiadomienia push z pustym komunikatem .. – hriziya

+0

jak wysłać wiele regidów do GCM? jak wysyłać wiadomości tekstowe, a nie "otrzymałeś wiadomość". – Tej

+2

Co to jest GoogleAppID? Czy to jest klucz API czy nazwa pakietu? – Jacek

2

JSON sposób

user1551788 odpowiedź działa dobrze, jednak ja lubię to robić w JSON, co jest lepszą praktyką zamiast wstawiania wszystkiego w jedną linię, tak myślę.

Klasa wewnętrzny „jsonObj” jest taka sama jak dokumentacja wymaga, sprawdzić różne wnioski można dokonać here

A Skrócony opis:

do: telefon, aby wysłać do, włóż registrationId, które otrzymałeś z telefonu tutaj. delay_while_idle Używając flagi delay_while_idle, powiadomienia zostaną dostarczone, gdy urządzenie stanie się aktywne. (wyjście z blokady, gdy użytkownik naprawdę korzysta z telefonu).

Dane: ustaw data z niestandardowymi parami klucz/wartość, aby przekazać dodatkowe ładunki do aplikacji klienckiej. Możesz więc wstawić dowolną zmienną, jeśli chcesz ciąg json zawierający inny obiekt, o ile nie przekracza 4 KB.

Niektóre są również dostępne, których nie używałem.

collapse_key: Jeśli ustawiony jest powiadomienie, że ma taką samą collapse_key nazwę należy zastąpić starszą powiadomienia (Metter dobrej implementacji po stronie telefonu, gdy zgłoszenie jest wysłać na serwer GCM będzie go zastąpić, gdy zgłoszenie jest w oczekiwaniu).

time_to_live: Prosto, jak długo powiadomienie pozostanie przy życiu, obecnie nie jest obsługiwane przez IOS.

Niektóre inne, patrz dokumentacja.

klasa wewnętrzna, ponieważ nie potrzebowałem tego obiektu poza moją klasą, co jest lepsze w przypadku nazywania "danych", które mogą być dowolne.

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

Aby go wykorzystać, po prostu:

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

Kolejną wielką różnicę zauważyłem, usługa google zwraca łańcuch json zawierający przydatne informacje, mówi ile udało i ile udało itp

Powiązane problemy