31天學會Windows Phone 7開發(fā):推送通知
本文是《Windows Phone 7開發(fā)31日談》系列的第十九篇文章。上一篇,我們介紹了WebBrowser控件,以及如何在程序中使用它。本文,我們來談談可能是這個系列中最重要的話題:推送通知。
可能你對推送通知這個概念還不是很熟悉,其實很簡單:不用強制你的應用程序每幾分鐘就去檢查一下服務器,服務器在有新數據的時候可以通知你的手機。
為什么要使用推送通知?
第一個原因,節(jié)省用戶的電池電量。檢測服務器數據很耗電,而在手機中,電池絕對是稀缺資源。你永遠不會有足夠的電量,并且不論你的電池能撐多久,都要盡量避免會使電池續(xù)航時間變短的通知。
第二,你可以通過推送通知來告知你的用戶在程序中發(fā)生了一些有趣的事,即使程序沒有運行。你還可以提醒用戶應該打開程序來看看你要告訴他們的事。
推送通知的過程
為了能讓你理解我在下面拋出來的代碼,我認為很有必要向你精確地解釋一下這個過程中所發(fā)生的事。
1.用戶在手機中首次運行程序時,應用程序會調用微軟的推送通知服務,請求一個用于通信的定制URI。
2.當在你的Web Service中激發(fā)了一個事件時,你應該向那個URI傳遞信息(附帶一個特定的負載),然后推送通知服務會以活動瓷磚更新,吐司(Toast)通知或者程序中真實數據的方式將數據發(fā)送到用戶的手機中。
本文就是要講解上述要點如何來做。如果你想看一個可以按部就班構建的例子,請參見Windows Phone開發(fā)人員訓練包。其中有一個非常出色的關于推送通知的教程。
從推送通知服務(Push Notification Service)中獲取定制的URI
非常感謝,微軟將這部分內容做得非常簡單。我們得使用Microsoft.Phone.Notification程序集,不過我還是得用10行代碼來從推送通知服務中(PNS)獲取一個定制的URI。首先,我得創(chuàng)建一個HttpNotificationChannel。它將自動與PNS通信(在另一個線程中),并且還得通過一個事件來捕獲服務返回的內容。
- HttpNotificationChannel channel;
- void GetPushChannel()
- {
- channel = new HttpNotificationChannel("BLANKENSOFT_" + DateTime.Now.Ticks.ToString());
- channel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(channel_ChannelUriUpdated);
- channel.Open();
- }
- void channel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
- {
- Dispatcher.BeginInvoke(delegate
- {
- URIBlock.Text = channel.ChannelUri.ToString();
- });
- }
在這個例子中我得到的URI是這樣的:
http://sn1.notify.live.net/throttledthirdparty/01.00/AAHsLicyiJgtTaiDbJoSgmFiAgAAAAADAwAAAAQUZm52OjlzOEQ2NDJDRkl5MEVFMEQ
一旦你有了URI,就可以在Web Service中保存它了。Web Service會初始化將要發(fā)送到你手機上的信息,我們有3種方法來實現:瓷磚(Tile)通知,吐司(Toast)通知和原生通知。
不同的需求,不同的消息
我剛才提到了你可以向手機發(fā)送3種不同類型的消息。下面是一個概述:
原生通知(Raw Notification)- 原生通知用于設備中真正在運行的程序。它允許你在用戶使用時實時更新用戶界面。
吐司通知(Toast Notification)– 無論程序是否在運行都會收到這個消息,但在程序運行時彈出吐司消息可能會有點兒討人厭。我會在下面的例子中演示。吐司通知不能更新你程序的數據。想做到這一點還是需要傳遞一個原生通知。
瓷磚通知(Tile Notification)– 如果你的程序被釘在了開始界面中,你可以用瓷磚通知來更新瓷磚。你可以改變背景圖片以及一個0-99的整數。
發(fā)送一個吐司通知
一旦我們得到了推送URI,剩下的就是組合HTTP消息的事了,然后將消息發(fā)送給這個URI。下面是代碼示例:
- HttpWebRequest sendNotificationRequest = (HttpWebRequest)WebRequest.Create(channel.ChannelUri.ToString());
- sendNotificationRequest.Method = "POST";
- //Indicate that you'll send toast notifications!
- sendNotificationRequest.ContentType = "text/xml";
- sendNotificationRequest.Headers = new WebHeaderCollection();
- sendNotificationRequest.Headers.Add("X-NotificationClass", "2");
- if (string.IsNullOrEmpty(txtMessage.Text)) return;
- //Create xml envelope
- string data = "X-WindowsPhone-Target: toast\r\n\r\n" +
- "<?xml version='1.0' encoding='utf-8'?>" +
- "<wp:Notification xmlns:wp='WPNotification'>" +
- "<wp:Toast>" +
- "<wp:Text1>{0}</wp:Text1>" +
- "</wp:Toast>" +
- "</wp:Notification>";
- //Wrap custom data into envelope
- string message = string.Format(data, txtMessage.Text);
- byte[] notificationMessage = Encoding.Default.GetBytes(message);
- // Set Content Length
- sendNotificationRequest.ContentLength = notificationMessage.Length;
- //Push data to stream
- using (Stream requestStream = sendNotificationRequest.GetRequestStream())
- {
- requestStream.Write(notificationMessage, 0, notificationMessage.Length);
- }
- //Get reponse for message sending
- HttpWebResponse response = (HttpWebResponse)sendNotificationRequest.GetResponse();
- string notificationStatus = response.Headers["X-NotificationStatus"];
- string notificationChannelStatus = response.Headers["X-SubscriptionStatus"];
- string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];
正如你所見,這部分代碼很長并且比較復雜。我建議你多花些時間在Windows Phone開發(fā)人員訓練包上,并且跟著推送通知的例子完整地走一遍。
這是一個演示推送通知(從頭到尾)如何工作的絕佳例子,同時向你展示了這些更新可以讓你的應用程序總是保持在用戶眼前的強大力量。
下載示例代碼
對于本文的例子來說,上面的代碼由于缺少所需的環(huán)境所以對你沒什么幫助。本文的下載內容實際上是Windows Phone開發(fā)人員訓練包中推送通知例子的最終版。
原作者:Jeff Blankenburg 譯者:金山崟霸
中文來源:http://www.cnblogs.com/porscheyin/archive/2010/12/23/1914884.html
英文來源:http://www.jeffblankenburg.com/2010/10/19/31-days-of-windows-phone-day-19-push-notifications/
【編輯推薦】