Подтвердить что ты не робот

Уведомление GCM Push с Asp.Net

Как вы, возможно, видели, Google переносит свою систему Push Notification System.

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

Есть ли какой-либо образец или справочная строка для внедрения облачных сообщений Google (GCM) с помощью приложения Asp.Net?

4b9b3361

Ответ 1

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

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

Ответ 2

вот код в С#

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

Ответ 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, чтобы получить ключ авторизации (как в случае с 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-приложения для получения push-уведомлений, посмотрите эту ссылку: http://developer.android.com/guide/google/gcm/gs.html#android-app

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

Ответ 4

способ JSON

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

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

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

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

data​​strong > : установите 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, содержащую полезную информацию, сообщает, сколько успешных и сколько не удалось и т.д.

Ответ 5

Nikunj Ganatra, вы можете проверить эту ссылку для своего типа ошибки, может быть, ваш идентификатор приложения будет неправильным или другие детали могут быть неправильными.. http://developer.android.com/guide/google/gcm/gcm.html#top

Ответ/Описание

200 Сообщение успешно обработано. Тело реакции будет    содержат более подробную информацию о статусе сообщения, но его формат будет    зависит ли запрос от JSON или обычного текста. См. Интерпретация    ответ успеха для более подробной информации.

400 Применяется только для запросов JSON. Указывает, что запрос не может быть проанализирован как JSON или содержит недопустимые поля (например, передача строки, в которой ожидалось число). Точная причина отказа описана в ответе, и проблема должна быть решена до того, как запрос может быть повторен.

401 Ошибка аутентификации учетной записи отправителя.

500 При попытке обработать запрос на сервере GCM произошла внутренняя ошибка.

503 Указывает, что сервер временно недоступен (т.е. из-за тайм-аутов и т.д.). Отправитель должен повторить попытку позже, соблюдая заголовок Retry-After, включенный в ответ. Серверы приложений должны обеспечивать экспоненциальное отключение. Сервер GCM занял слишком много времени, чтобы обработать запрос.

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