正如你可能已经看到,谷歌正在迁移的推送通知系统。
http://developer.android.com/guide/google/gcm/c2dm.html
是否有任何样本或引导线可通过使用一个Asp.Net应用程序中实现谷歌云端通讯(GCM)?
正如你可能已经看到,谷歌正在迁移的推送通知系统。
http://developer.android.com/guide/google/gcm/c2dm.html
是否有任何样本或引导线可通过使用一个Asp.Net应用程序中实现谷歌云端通讯(GCM)?
我有一段代码,这是工作的罚款,我和可能是有帮助的,我测试了它......
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();
}
这里是在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();
前阵子我一直在玩弄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
我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不要求你对谷歌进行身份验证,以获得一个auth密钥(视情况与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。
JSON方式
user1551788答案工作正常,但是我喜欢这样做的JSON,这是更好的做法,而不是在一个行插入的一切,我想。
内部类的jsonObj'是一样的文件要求,检查可以使不同的请求在这里
简要说明:
于 :手机发送到,插入您从手机收到这里的registrationId。 delay_while_idle通过使用delay_while_idle标志,一旦设备变为活动的通知将被递送。 (失锁,当用户真正使用的电话)。
数据 :设定data
使用自定义键/值对传递额外的有效载荷到客户端应用程序。 所以,你可以把你想要的任何变量,如果你喜欢,它包含另一个对象的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字符串包含有用信息,它告诉多少成功,多少次失败,等等。
Nikunj Ganatra,你可以一次看看这个链接,你的错误类型,也许你的应用程序ID将是错误的或其他细节可能不正确.. http://developer.android.com/guide/google/gcm/gcm.html#最佳
响应/说明
消息200被成功处理。 响应体将包含有关消息状态的详细信息,但其格式取决于请求是JSON或纯文本。 请参阅解释更多的细节成功响应。
400只适用于JSON请求。 指示请求不能被解析为JSON,或者它包含无效的字段(例如,通过其中的一些预期的字符串)。 确切的失败原因在响应中描述和请求可以重试之前的问题应该得到解决。
401有验证发件人帐户的错误。
500,而试图处理该请求有一个在GCM服务器内部错误。
503表示服务器暂时不可用(即,因为超时,等等)。 发件人必须稍后重试,表彰在响应任何Retry-After头。 应用服务器必须实现指数回退。 该GCM服务器花了太长时间来处理请求。
我刚才纠正它。