2012-06-29 34 views

Trả lời

3

Một thời gian trước tôi đã chơi xung quanh với C2DM để gửi thông báo đẩy. Tôi thay đổi mã của tôi theo những thay đổi được đề cập trên trang này: http://developer.android.com/guide/google/gcm/c2dm.html#server để tận dụng cho dịch vụ GCM:

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

chức năng SendNotification của tôi:

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 

Dường như GCM không yêu cầu bạn xác thực chống lại Google để có được một khóa auth (như trường hợp với C2DM). Thay vào đó, bạn sẽ yêu cầu một khóa API đang được chuyển tới hàm SendNotification. Trang này sẽ giúp bạn khóa API của bạn thiết lập: http://developer.android.com/guide/google/gcm/gs.html

Mã cho mẫu web của tôi là dưới đây chỉ trong trường hợp:

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

Đối với việc tạo ra ứng dụng Android của bạn để nhận được thông báo đẩy, kiểm tra liên kết này: http://developer.android.com/guide/google/gcm/gs.html#android-app

Đừng quên nhập System.Net, System.IO, System.Security.Cryptography.X509Certificates and System.Net.Security.

+0

Hi Zishan, Cảm ơn bạn đã trả lời. Bạn đã đăng mã đã được triển khai bằng cách sử dụng dịch vụ C2DM. –

+0

Xin chào, có bất kỳ dòng mẫu hoặc gudie nào có sẵn để triển khai Google Cloud Messaging (GCM) bằng cách sử dụng ứng dụng Asp.Net không? –

+0

hi là có bất kỳ giải pháp có sẵn trong Asp.net giống như: http://developer.android.com/guide/google/gcm/demo.html –

7

đây là mã trong 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, bạn một lần có thể kiểm tra liên kết này cho loại lỗi của bạn, có lẽ id ứng dụng của bạn sẽ là sai lầm hoặc các chi tiết khác có thể không đúng .. 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.

Tôi vừa sửa chữa nó.

9

Tôi có một đoạn mã mà đang làm việc tốt cho tôi và có thể là hữu ích, tôi đã kiểm tra nó ra ...

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

Tôi đã thử nhiều mã khác nhau có sẵn trên để gửi GCM đẩy .. và chỉ có một công trình này hoàn hảo .. Mã khác đã làm việc nhưng tôi đã nhận được thông báo đẩy với thông báo trống .. – hriziya

+0

làm thế nào để gửi nhiều regid đến GCM? cách gửi tin nhắn văn bản thay vì "bạn nhận được tin nhắn". – Tej

+2

GoogleAppID là gì? Có phải API key hoặc packagename không? – Jacek

2

JSON cách

user1551788 câu trả lời hoạt động tốt, tuy nhiên tôi thích làm điều đó trong JSON, đó là thực hành tốt hơn thay vì chèn mọi thứ vào một dòng, tôi nghĩ vậy.

Lớp nội 'jsonObj' cũng giống như các tài liệu yêu cầu, kiểm tra các yêu cầu khác nhau mà bạn có thể làm cho here

Một mô tả ngắn gọn:

để: điện thoại để gửi đến, chèn registrationId mà bạn đã nhận được từ điện thoại tại đây. delay_while_idle Bằng cách sử dụng cờ delay_while_idle, thông báo sẽ được gửi sau khi thiết bị hoạt động. (ngoài khóa, khi người dùng thực sự sử dụng điện thoại).

dữ liệu: đặt data với cặp khóa/giá trị tùy chỉnh để chuyển tải trọng bổ sung cho ứng dụng khách. Vì vậy, bạn có thể đặt vào bất kỳ biến nào bạn muốn, nếu bạn thích một chuỗi json chứa một đối tượng khác, miễn là nó không vượt quá 4 KB.

Một số cũng có sẵn mà tôi không sử dụng.

collapse_key: Nếu thiết lập, một thông báo rằng có cùng collapse_key tên nên được ghi đè lên các thông báo cũ (Metter thực hiện tốt ở bên cạnh điện thoại khi thông báo là gửi, trên máy chủ GCM nó sẽ ghi đè khi thông báo là đang chờ xử lý).

time_to_live: Thẳng về phía trước, thời lượng thông báo sẽ vẫn hoạt động, hiện không được hỗ trợ cho IOS.

Một số khác, xem tài liệu.

lớp nội bộ vì tôi không cần đối tượng đó bên ngoài lớp học, tốt hơn là đặt tên như 'dữ liệu' có thể là bất kỳ thứ gì.

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

Để sử dụng, bạn chỉ cần:

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

Một khác biệt tuyệt vời, tôi đã nhận thấy, dịch vụ google trả về một chuỗi json chứa thông tin hữu ích, nó nói có bao nhiêu thành công và có bao nhiêu thất bại vv

Các vấn đề liên quan