Antwort

3

Vor einiger Zeit spielte ich mit C2DM herum, um Push-Benachrichtigungen zu senden. Ich änderte meinen Code als je auf dieser Seite genannten Änderungen: http://developer.android.com/guide/google/gcm/c2dm.html#server zur Verwendung für GCM Service zu machen:

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

Meine SendNotification Funktion:

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 

Es scheint, dass GCM erfordert Sie nicht gegen Google zu authentifizieren um einen Authentifizierungsschlüssel zu erhalten (wie es bei C2DM der Fall war). Stattdessen benötigen Sie einen API-Schlüssel, der an die SendNotification-Funktion übergeben wird. Diese Seite sollten Sie Ihren API-Schlüssel einrichten Hilfe bekommen: http://developer.android.com/guide/google/gcm/gs.html

Der Code für meine Web-Formular ist unter den Fall der Fälle:

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

Wie für Ihre Android-App auf den Empfang der Push-Benachrichtigungen erstellen, überprüfen Diese Verbindung: http://developer.android.com/guide/google/gcm/gs.html#android-app

Vergessen Sie nicht, System.Net, System.IO, System.Security.Cryptography.X509Certificates und System.Net.Security zu importieren.

+0

Hallo Zishan, Danke für die Antwort. Sie haben einen Code veröffentlicht, der mit dem C2DM-Dienst implementiert wurde. –

+0

Hallo, Gibt es eine Beispiel- oder Google Line, um Google Cloud Messaging (GCM) mithilfe der Asp.Net-Anwendung zu implementieren? –

+0

Hallo, gibt es eine Lösung in Asp.net wie: http://developer.android.com/guide/google/gcm/demo.html –

7

hier der Code in C# ist

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, können Sie einmal auf diesen Link für Ihre Fehlertyp überprüfen, vielleicht Ihre Anwendung id falsch wäre oder andere Details falsch sein .. 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.

Ich habe es gerade behoben.

9

Ich habe ein Stück Code, der für mich arbeitet gut und nützlich sein könnte, ich es testete ...

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

Ich habe versucht, viele diff-Code für das Senden GCM push .. und nur dieser eine funktioniert perfekt .. Andere Codes funktionierten, aber ich bekam Push-Benachrichtigung mit leeren Nachricht .. – hriziya

+0

Wie zu senden mehrere regid's zu GCM? wie man Textnachrichten anstatt "Sie haben Nachricht" sendet. – Tej

+2

Was ist GoogleAppID? Ist es API-Schlüssel oder Paketname? – Jacek

2

JSON Weg

user1551788 Antwort funktioniert gut, ich aber Ich mache es gerne in JSON, was besser ist, anstatt alles in eine Zeile einzufügen, denke ich.

Die interne Klasse ‚jsonObj‘ ist die gleiche wie die Dokumentation erfordert, überprüfen Sie die verschiedenen Anfragen Sie here

Eine kurze Beschreibung machen:

zu: das Telefon zu senden, legen Sie die registrationId, die Sie hier vom Telefon erhalten haben. delay_while_idle Mit dem Delay_while_idle-Flag werden Benachrichtigungen gesendet, sobald das Gerät aktiv wird. (nicht gesperrt, wenn der Benutzer das Telefon tatsächlich benutzt).

Daten: Setzen Sie data mit benutzerdefinierten Schlüssel/Wert-Paaren, um zusätzliche Nutzlast an die Client-App zu übergeben. Sie können also jede beliebige Variable einfügen, wenn Sie eine JSON-Zeichenfolge möchten, die ein anderes Objekt enthält, solange sie nicht größer als 4 KB ist.

Einige, die auch verfügbar sind, habe ich nicht verwendet.

collapse_key: Wenn gesetzt, eine Benachrichtigung, dass die gleichen collapse_key Namen hat, sollte die ältere Meldung (metter guter Umsetzung auf der Telefonseite werden überschreibt, wenn Benachrichtigung überschreibt senden, auf dem GCM-Server ist es, wenn die Benachrichtigung steht aus).

time_to_live: Direkt, wie lange die Benachrichtigung am Leben bleiben wird, derzeit nicht für IOS unterstützt.

Einige andere, siehe Dokumentation.

interne Klasse, weil ich dieses Objekt außerhalb meiner Klasse nicht benötigt, das ist besser für die Benennung wie "Daten", die alles sein könnten.

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

zu verwenden, einfach:

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

Ein weiterer großer Unterschied, den ich bemerkt haben, kehrt der Google-Dienst einen JSON-String nützliche Informationen enthält, erzählt sie, wie viele gelungen und wie viele gescheiterte usw.