Вопрос по asp.net, google-cloud-messaging, push-notification, android – Push-уведомление GCM с Asp.Net

17

Как вы могли видеть, Google переносит свою систему push-уведомлений.

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

Есть ли какие-либо примеры или руководства для внедрения Google Cloud Messaging (GCM) с помощью приложения Asp.Net?

Ваш Ответ

5   ответов
2

JSON way

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

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

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

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

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

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();
}
как отправить несколько регидов в GCM? как отправлять текстовые сообщения, а не «вы получили сообщение».
Используя приведенный выше код, я получаю ответ сервера как id = 0: 1374042920524416% 5252b7a166d6cf16. Я делаю что-то не так? я использую идентификатор приложения в качестве ключа API отcode.google.com/apis/console и senderID - номер проекта, созданный с использованием вышеуказанной ссылки. Пожалуйста, помогите мне.
Я перепробовал множество различных кодов для отправки push-уведомлений GCM ... и только этот работает отлично ... Другие коды работали, но я получал push-уведомление с пустым сообщением ...
Что такое GoogleAppID? Это ключ API или имя пакета?
Для всех: applicationID - это ключ API Google, senderId - это идентификатор проекта Google, а regId - это идентификатор, полученный с вашего телефона, когда ваш телефон зарегистрирован в GCM. Я могу подтвердить, что это работает, но решение с json было бы лучше, включая множественные регистрационные идентификаторы. Для справок:developers.google.com/cloud-messaging/http
7

 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

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

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

3

изменил свой код в соответствии с изменениями, упомянутыми на этой странице: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). Вместо этого вам потребуется ключ 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.

Привет, есть ли образец или линия поддержки для внедрения Google Cloud Messaging (GCM) с помощью приложения Asp.Net? Nikunj Ganatra
Привет Zishan, спасибо за ответ. Вы разместили код, который был реализован с использованием сервиса C2DM. Nikunj Ganatra
Зишан, я также реализовал код в соответствии с твоим указанием. Но я получаю сообщение об ошибке: Удаленный сервер возвратил ошибку: (401) Несанкционированный. В следующей строке: WebResponse Response = Request.GetResponse (); Это может быть связано с URL-адресом запроса: & quot;android.googleapis.com/gcm/send& Quot; * HttpWebRequest Request = (HttpWebRequest) WebRequest.Create (& quot;android.googleapis.com/gcm/send"); Пожалуйста, проверьте мой последний ответ / ответ для деталей, так как у меня ограниченный текст, поэтому я не мог дать более подробную информацию здесь. Nikunj Ganatra
Привет, есть ли какое-либо решение в Asp.net так же, как:developer.android.com/guide/google/gcm/demo.html Nikunj Ganatra
Привет Nikunj, попробуйте код, который я разместил выше. Теперь он должен работать с GCM.

Похожие вопросы