HttpNotificationChannel 云端推送信息实现
?
?
Push Notification簡介
目前,Windows Phone支持三種Push Notification方式:Toast Notifications、Tile Notifications和Raw Notifications,我不想翻譯成中文名字了,因?yàn)椤巴滤尽敝惖姆g無法幫助理解。
Toast Notifications,當(dāng)我們的程序沒有運(yùn)行時(shí),我們希望有一種形式可以通知用戶,并且讓用戶調(diào)用對(duì)應(yīng)的應(yīng)用,就像收到SMS時(shí),調(diào)用Messaging程序一樣。運(yùn)行效果如下圖,當(dāng)用戶點(diǎn)擊Toast時(shí),可以調(diào)用對(duì)應(yīng)的程序。
Tile Notifications,用于更新啟動(dòng)界面上的Tile,可以通過Tile Notifications設(shè)置Tile的背景圖片、Count和Title等屬性,各屬性顯示位置如下圖所示。我們可以通過該技術(shù)來提示用戶,我們的應(yīng)用有新的事件發(fā)生,比如SNS上有多少新的回復(fù)等。
Raw Notifications,最簡單,當(dāng)你的應(yīng)用程序運(yùn)行時(shí),可以接收Raw Notification信息,如果程序沒有運(yùn)行,則接受不到Raw Notification。
接下來,我們會(huì)以Toast Notifications為例詳細(xì)介紹,Push Notification的原理和使用方法。
首先,還是引用這張廣為流傳的圖示吧,確實(shí)是目前能夠找到的最詳細(xì)的示意圖了。下面是步驟敘述:
1-3,應(yīng)用通過調(diào)用HttpNotificationChannel接口,向Microsoft Push Notification Service (MPNS)請(qǐng)求一個(gè)URI,這個(gè)URI會(huì)在服務(wù)器端發(fā)送Notification消息時(shí),作為驗(yàn)證發(fā)送目標(biāo)的唯一標(biāo)識(shí);這樣做的一個(gè)好處是,當(dāng)同一個(gè)設(shè)備上有多個(gè)應(yīng)用在監(jiān)聽Notification時(shí),不會(huì)相互干擾。
4. 應(yīng)用會(huì)將獲得的URI傳到自己的服務(wù)器上,這個(gè)URI會(huì)存儲(chǔ)在自己的服務(wù)器上,用于發(fā)送Push Notification時(shí)調(diào)用。URI的傳遞和存儲(chǔ)方式,由開發(fā)者自己決定,不過要保��傳輸過程的加密,以及存儲(chǔ)時(shí)的安全性。接下來的實(shí)例里,傳遞和存儲(chǔ)URI的方式就很有創(chuàng)意。
5-6. 當(dāng)服務(wù)器端有信息要通知應(yīng)用時(shí),需要向MPNS發(fā)起一個(gè)Http請(qǐng)求,而MPNS將請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的設(shè)備上,設(shè)備上的應(yīng)用接到Push Notification的消息后,進(jìn)行相應(yīng)的處理。
?
?
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服務(wù)
13 HttpNotification.BindToShellTile();///綁定Tile服務(wù)
?
數(shù)據(jù)包
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 }
發(fā)送數(shù)據(jù)
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"];
?
服務(wù)器端我用的是Web,可以直接在客戶端連接后,保存到Application里直接讀取。
源碼下載:http://files.cnblogs.com/lsmayday/CloudWeb.rar
?
轉(zhuǎn)載于:https://www.cnblogs.com/lsmayday/archive/2011/11/08/2240896.html
總結(jié)
以上是生活随笔為你收集整理的HttpNotificationChannel 云端推送信息实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Blink, 通向哈里·波特的魔法世界
- 下一篇: ATL-CComCreator(CCom