ответ

3

Некоторое время назад я играл с C2DM для отправки push-уведомлений. Я изменил свой код в соответствии с изменениями, упомянутые на этой странице: http://developer.android.com/guide/google/gcm/c2dm.html#server использовать для GCM службы:

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

Моя функция 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 

Кажется, что GCM не требует аутентификации от Google для получения ключа auth (как в случае с C2DM). Вместо этого вам потребуется ключ API, который передается функции SendNotification. Эта страница поможет вам получить ключ API настройки: http://developer.android.com/guide/google/gcm/gs.html

Код для моего веб-форму ниже только в случае, если:

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

Что касается создания вашего Android приложение, чтобы получать уведомления толчка, проверьте эта ссылка: http://developer.android.com/guide/google/gcm/gs.html#android-app

Не забудьте импортировать System.Net, System.IO, System.Security.Cryptography.X509Certificates и System.Net.Security.

+0

Привет, Zishan, Спасибо за ответ. Вы опубликовали код, который был реализован с использованием службы C2DM. –

+0

Привет, Есть ли образец или линия gudie для внедрения Google Cloud Messaging (GCM) с помощью приложения Asp.Net? –

+0

привет, есть ли решение доступно в Asp.net так же, как: http://developer.android.com/guide/google/gcm/demo.html –

7

здесь код в 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, вы можете сразу проверить эту ссылку для вашего типа ошибки, может быть, ваш идентификатор приложения будет неправильно или другие детали могут быть неточными .. 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.

Я только что исправился.

9

У меня есть кусок кода, который работает хорошо для меня и может быть полезным, я проверил его ...

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

Я пробовал использовать много кода для отправки GCM push .. и только этот работает отлично .. Другие коды работали, но я получал push-уведомление с пустым сообщением. – hriziya

+0

как отправить несколько regid's в GCM? как отправлять текстовые сообщения, а не «вы получили сообщение». – Tej

+2

Что такое GoogleAppID? Является ли это ключ API или packagename? – Jacek

2

JSON путь

user1551788 ответ работает нормально, но я как сделать это в JSON, что лучше, а не вставлять все в одну строку, я думаю.

Внутренний класс «jsonObj» такой же, как документация требует проверки различных запросов вы можете сделать here

Краткое описание:

к: телефон для отправки, вставьте registerId, что вы получили от телефона здесь. delay_while_idle С помощью флага delay_while_idle уведомления будут доставлены после активации устройства. (из-за блокировки, когда пользователь действительно использует телефон).

данные: набор data с настраиваемыми парами ключ/значение для передачи дополнительной полезной нагрузки клиентскому приложению. Таким образом, вы можете поместить любую переменную, которую хотите, если вам нравится строка json, содержащая другой объект, если она не превышает 4 КБ.

Некоторые из них также доступны, которые я не использовал.

collapse_key: Если установлено, уведомление, что имеет такое же collapse_key имени следует переписать старое уведомление (РАЗНИЦУ хорошей реализации на стороне телефона, когда извещение высылается, на сервере GCM будет перезаписывать, когда уведомление в ожидании).

time_to_live: Прямо вперед, как долго уведомление останется в живых, в настоящее время оно не поддерживается для IOS.

Некоторые другие, см. Документацию.

внутренний класс, потому что мне не нужен этот объект за пределами моего класса, что лучше для именования как «данные», которые могут быть чем угодно.

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

Для использования, просто:

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

Еще одно большое различие, которое я заметил, служба Google возвращает строку JSON, содержащий полезную информацию, он сообщает, сколько удалось, и сколько не удалось, и т.д.

Смежные вопросы