正如您所看到的,Google正在迁移其推送通知系统。
http://developer.android.com/guide/google/gcm/c2dm.html
是否有可用于使用Asp.Net应用程序实施Google Cloud Messaging(GCM)的示例或指南?
答案 0 :(得分: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() + "®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();
}
答案 1 :(得分: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();
答案 2 :(得分: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
我的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一样)。相反,您需要一个传递给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。
答案 3 :(得分:2)
JSON方式
user1551788答案工作正常,但我喜欢用JSON做,这是更好的做法,而不是将所有内容插入一行,我想。
内部课程&#39; jsonObj&#39;与文档要求的相同,请检查您可以进行的here
的不同请求简要说明:
到:要发送的手机,请在此处插入您从手机收到的registrationId。 delay_while_idle 通过使用delay_while_idle标志,一旦设备变为活动状态,将通知通知。 (当用户真正使用手机时,没有锁定。)
数据:使用自定义键/值对设置data
,以将额外的有效负载传递到客户端应用。因此,如果你喜欢包含另一个对象的json字符串,只要它不超过4 KB,你可以输入你想要的任何变量。
我也没有使用过一些。
collapse_key :如果已设置,则具有相同collapse_key
名称的通知应覆盖旧通知(在发送通知时,在GCM上在电话端执行良好的通知)服务器将在通知挂起时覆盖。)
time_to_live :直接向前,通知将保持多久,目前IOS不支持。
其他一些,请参阅文档。
内部课程,因为我不需要在课堂外使用该对象,这样更适合命名数据&#39;数据&#39;这可能是任何事情。
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字符串,它告诉我们有多少成功,多少次失败等等。
答案 4 :(得分:0)
Nikunj Ganatra,您可以查看此错误类型的链接,也许您的应用程序ID错误或其他详细信息可能不正确。http://developer.android.com/guide/google/gcm/gcm.html#top
<强>响应/描述强>
已成功处理200条消息。响应机构将 包含有关消息状态的更多详细信息,但其格式为 取决于请求是JSON还是纯文本。请参阅解释a 成功回应了解更多详情。
400仅适用于JSON请求。表示请求无法解析为JSON,或者包含无效字段(例如,传递一个字符串,其中包含预期的数字)。在响应中描述了确切的失败原因,并且在重试请求之前应该解决问题。
401验证发件人帐户时出错。
500尝试处理请求时,GCM服务器中出现内部错误。
503表示服务器暂时不可用(即,由于超时等)。发件人必须稍后重试,以兑现响应中包含的任何Retry-After标头。应用程序服务器必须实现指数退避。 GCM服务器花了太长时间来处理请求。
我刚刚纠正了它。