HttpNotificationChannel 云端推送信息实现

 

 

Push Notification简介

目前,Windows Phone支持三种Push Notification方式:Toast Notifications、Tile Notifications和Raw Notifications,我不想翻译成中文名字了,因为“吐司”之类的翻译无法帮助理解。

Toast Notifications,当我们的程序没有运行时,我们希望有一种形式可以通知用户,并且让用户调用对应的应用,就像收到SMS时,调用Messaging程序一样。运行效果如下图,当用户点击Toast时,可以调用对应的程序。

clip_image002

Tile Notifications,用于更新启动界面上的Tile,可以通过Tile Notifications设置Tile的背景图片、Count和Title等属性,各属性显示位置如下图所示。我们可以通过该技术来提示用户,我们的应用有新的事件发生,比如SNS上有多少新的回复等。

clip_image004

Raw Notifications,最简单,当你的应用程序运行时,可以接收Raw Notification信息,如果程序没有运行,则接受不到Raw Notification。

接下来,我们会以Toast Notifications为例详细介绍,Push Notification的原理和使用方法。

clip_image006

首先,还是引用这张广为流传的图示吧,确实是目前能够找到的最详细的示意图了。下面是步骤叙述:

1-3,应用通过调用HttpNotificationChannel接口,向Microsoft Push Notification Service (MPNS)请求一个URI,这个URI会在服务器端发送Notification消息时,作为验证发送目标的唯一标识;这样做的一个好处是,当同一个设备上有多个应用在监听Notification时,不会相互干扰。

4. 应用会将获得的URI传到自己的服务器上,这个URI会存储在自己的服务器上,用于发送Push Notification时调用。URI的传递和存储方式,由开发者自己决定,不过要保��传输过程的加密,以及存储时的安全性。接下来的实例里,传递和存储URI的方式就很有创意。

5-6. 当服务器端有信息要通知应用时,需要向MPNS发起一个Http请求,而MPNS将请求转发到相应的设备上,设备上的应用接到Push Notification的消息后,进行相应的处理。

 

 

HttpNotificationChannel

View Code
 1                     HttpNotification = new HttpNotificationChannel(ChannelName, "NotificationServer");
2 HttpNotification.ChannelUriUpdated += (_sender, _e) =>
3 {
4 RegWebCloud(this.CloudHelper.CloudItems[0].Keys, _e.ChannelUri.ToString());
5 };
6 HttpNotification.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(HttpNotification_ErrorOccurred);
7 HttpNotification.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(HttpNotification_HttpNotificationReceived);
8 HttpNotification.ShellToastNotificationReceived+=new EventHandler<NotificationEventArgs>(HttpNotification_ShellToastNotificationReceived);
9
10 HttpNotification.Open();
11
12 HttpNotification.BindToShellToast();///绑定Toast服务
13 HttpNotification.BindToShellTile();///绑定Tile服务

 

数据包

View Code
 1             byte[] SendData = null;
2 string Temp = "";
3 switch (Type) {
4 case "raw":
5 Temp = Context;
6 SendData = new System.Text.UTF8Encoding().GetBytes(Temp);
7 break;
8 case "toast":
9 Temp = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
10 Temp += "<wp:Notification xmlns:wp=\"WPNotification\">";
11 Temp += "<wp:Toast>";
12 Temp += "<wp:Text1>推送</wp:Text1>";
13 Temp += "<wp:Text2>@Context</wp:Text2>";
14 Temp += "</wp:Toast>";
15 Temp += "</wp:Notification>";
16 Temp = Temp.Replace("@Context", Context);
17 SendData = new System.Text.UTF8Encoding().GetBytes(Temp);
18 break;
19 case "tokens":
20 Temp = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
21 Temp += "<wp:Notification xmlns:wp=\"WPNotification\">";
22 Temp += "<wp:Tile>";
23 Temp += "<wp:Count>0</wp:Count>";
24 Temp += "<wp:Title>@Context</wp:Title>";
25 Temp += "</wp:Tile>";
26 Temp += "</wp:Notification>";
27 Temp = Temp.Replace("@Context", Context);
28 SendData = new System.Text.UTF8Encoding().GetBytes(Temp);
29 break;
30 }

发送数据

View Code
 1             HttpWebRequest HttpWebReques = (HttpWebRequest)WebRequest.Create(Urls);
2 HttpWebReques.Method = WebRequestMethods.Http.Post;
3 HttpWebReques.Headers["X-MessageID"] = Guid.NewGuid().ToString();
4
5 switch (Type)
6 {
7 case "raw":
8 HttpWebReques.ContentType = "text/xml;charset=utf-8";
9 HttpWebReques.Headers.Add("X-NotificationClass", "3");
10 ///3 :消息立即推送
11 ///13:450秒推送
12 ///23:900秒推送
13 break;
14 case "toast":
15 HttpWebReques.ContentType = "text/xml; charset=utf-8";
16 HttpWebReques.Headers.Add("X-WindowsPhone-Target", "toast");
17 HttpWebReques.Headers.Add("X-NotificationClass", "2");
18 ///2 :消息立即推送
19 ///12:450秒推送
20 ///22:900秒推送
21 break;
22 case "tokens":
23 HttpWebReques.ContentType = "text/xml; charset=utf-8";
24 HttpWebReques.Headers.Add("X-WindowsPhone-Target", "token");
25 HttpWebReques.Headers.Add("X-NotificationClass", "1");
26 ///1 :消息立即推送
27 ///11:450秒推送
28 ///21:900秒推送
29 break;
30 }
31
32 HttpWebReques.ContentLength = Data.Length;
33 using (Stream RequestStream = HttpWebReques.GetRequestStream())
34 {
35 RequestStream.Write(Data, 0, Data.Length);
36 }
37 HttpWebResponse response = (HttpWebResponse)HttpWebReques.GetResponse();
38 string NotificationStatus = response.Headers["X-NotificationStatus"];
39 string SubscriptionStatus = response.Headers["X-SubscriptionStatus"];
40 string DeviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];

 

服务器端我用的是Web,可以直接在客户端连接后,保存到Application里直接读取。



源码下载:https://files.cnblogs.com/lsmayday/CloudWeb.rar
 

posted @ 2011-11-08 11:35  十年一刻·i  阅读(837)  评论(0编辑  收藏  举报