Вопрос по asp.net, google-cloud-messaging, push-notification, android – Push-уведомление GCM с Asp.Net
Как вы могли видеть, Google переносит свою систему push-уведомлений.
http://developer.android.com/guide/google/gcm/c2dm.html
Есть ли какие-либо примеры или руководства для внедрения Google Cloud Messaging (GCM) с помощью приложения Asp.Net?
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, содержащую полезную информацию, он сообщает, сколько успешно, сколько неудачно и т. Д.
который работает нормально для меня и может быть полезным, я проверил его ...
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() + "®istration_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();
}
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();
вы можете однажды проверить эту ссылку для вашего типа ошибки, возможно, ваш идентификатор приложения будет неправильным или другие детали могут быть неверными ..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.
Я только что исправил это.
изменил свой код в соответствии с изменениями, упомянутыми на этой странице: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.