17

您可能已经看到,Google 正在迁移其推送通知系统。

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

是否有任何示例或指南可用于使用 Asp.Net 应用程序实现 Google Cloud Messaging (GCM)?

4

5 回答 5

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();
}
于 2012-07-25T13:39:22.897 回答
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();
于 2012-07-06T01:20:22.237 回答
3

前段时间我一直在玩 C2DM 来发送推送通知。我根据此页面上提到的更改更改了我的代码: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

我的发送通知功能:

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 进行身份验证来获取身份验证密钥(与 C2DM 的情况一样)。相反,您需要一个传递给 SendNotification 函数的 API 密钥。此页面应该可以帮助您设置 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。

于 2012-06-29T12:49:24.113 回答
2

JSON方式

user1551788 答案工作正常,但是我喜欢用 JSON 来做,我认为这是更好的做法,而不是在一行中插入所有内容。

内部类 'jsonObj' 与文档要求的相同,请在此处检查您可以提出的不同请求

简要说明:

to:要发送到的手机,在此处插入您从手机收到的registrationId。 delay_while_idle通过使用 delay_while_idle 标志,一旦设备变为活动状态,就会发送通知。(失锁,当用户真正使用手机时)。

datadata使用自定义键/值对设置以将额外的有效负载传递给客户端应用程序。所以,如果你喜欢包含另一个对象的 json 字符串,你可以放入任何你想要的变量,只要它不超过 4 KB。

一些我没用过的也可用。

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

我注意到另一个很大的区别,谷歌服务返回一个包含有用信息的 json 字符串,它告诉有多少成功和多少失败,等等。

于 2015-07-02T14:43:07.110 回答
0

Nikunj Ganatra,您可以查看此链接以了解您的错误类型,也许您的应用程序 ID 错误或其他详细信息可能不正确.. http://developer.android.com/guide/google/gcm/gcm.html#最佳

响应/描述

200 消息已成功处理。响应正文将包含有关消息状态的更多详细信息,但其格式将取决于请求是 JSON 还是纯文本。有关更多详细信息,请参阅解释成功响应。

400 仅适用于 JSON 请求。表示请求无法解析为 JSON,或者它包含无效字段(例如,在需要数字的地方传递字符串)。响应中描述了确切的失败原因,并且应该在重试请求之前解决问题。

401 验证发件人帐户时出错。

500 尝试处理请求时 GCM 服务器出现内部错误。

503 表示服务器暂时不可用(即由于超时等原因)。发件人必须稍后重试,遵守响应中包含的任何 Retry-After 标头。应用程序服务器必须实现指数退避。GCM 服务器处理请求的时间过长。

我刚刚纠正了它。

于 2012-07-16T15:01:17.723 回答