HttpNotificationChannel 云端推送信息实现
?
?
Push Notification簡介
目前,Windows Phone支持三種Push Notification方式:Toast Notifications、Tile Notifications和Raw Notifications,我不想翻譯成中文名字了,因為“吐司”之類的翻譯無法幫助理解。
Toast Notifications,當我們的程序沒有運行時,我們希望有一種形式可以通知用戶,并且讓用戶調用對應的應用,就像收到SMS時,調用Messaging程序一樣。運行效果如下圖,當用戶點擊Toast時,可以調用對應的程序。
Tile Notifications,用于更新啟動界面上的Tile,可以通過Tile Notifications設置Tile的背景圖片、Count和Title等屬性,各屬性顯示位置如下圖所示。我們可以通過該技術來提示用戶,我們的應用有新的事件發生,比如SNS上有多少新的回復等。
Raw Notifications,最簡單,當你的應用程序運行時,可以接收Raw Notification信息,如果程序沒有運行,則接受不到Raw Notification。
接下來,我們會以Toast Notifications為例詳細介紹,Push Notification的原理和使用方法。
首先,還是引用這張廣為流傳的圖示吧,確實是目前能夠找到的最詳細的示意圖了。下面是步驟敘述:
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里直接讀取。
源碼下載:http://files.cnblogs.com/lsmayday/CloudWeb.rar
?
轉載于:https://www.cnblogs.com/lsmayday/archive/2011/11/08/2240896.html
總結
以上是生活随笔為你收集整理的HttpNotificationChannel 云端推送信息实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Blink, 通向哈里·波特的魔法世界
- 下一篇: ATL-CComCreator(CCom