本文是“Windows Phone 7 開發 31 日談”系列的第19日。
昨天,我介紹了WebBrowser控制項,以及如何在程式中使用它。今天,我們來談談可能是這個系列中最重要的話題:推播通知。
可能你對推播通知這個概念還不是很熟悉,其實很簡單:不用強制你的應用程式每幾分鐘就去檢查一下伺服器,伺服器在有新資料的時候可以通知你的手機。
為什麼要使用推播通知?
第一個原因,節省使用者的電池電量。檢測伺服器資料很耗電,而在手機中,電池絕對是稀缺資源。你永遠不會有足夠的電量,並且不論你的電池能撐多久,都要盡量避免會使電池續航時間變短的通知。
第二,你可以通過推播通知來告知你的使用者在程式中發生了一些有趣的事,即使程式沒有運行。你還可以提醒使用者應該開啟程式來看看你要告訴他們的事。
推播通知的過程
為了能讓你理解我在下面拋出來的代碼,我認為很有必要向你精確地解釋一下這個過程中所發生的事。
- 使用者在手機中首次運行程式時,應用程式會調用微軟的推播通知服務,請求一個用於通訊的定製URI。
- 當在你的Web Service中激發了一個事件時,你應該向那個URI傳遞資訊(附帶一個特定的負載),然後推播通知服務會以活動瓷磚更新,多士(Toast)通知或者程式中真實資料的方式將資料發送到使用者的手機中。
本文就是要講解上述要點如何來做。如果你想看一個可以按部就班構建的例子,請參見Windows Phone開發人員訓練包。其中有一個非常出色的關於推播通知的教程。
從推播通知服務(Push Notification Service)中擷取定製的URI
非常感謝,微軟將這部分內容做得非常簡單。我們得使用Microsoft.Phone.Notification程式集,不過我還是得用10行代碼來從推播通知服務中(PNS)擷取一個定製的URI。首先,我得建立一個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會初始化將要發送到你手機上的資訊,我們有3種方法來實現:瓷磚(Tile)通知,多士(Toast)通知和原生通知。
不同的需求,不同的訊息
我剛才提到了你可以向手機發送3種不同類型的訊息。下面是一個概述:
原生通知(Raw Notification)- 原生通知用於裝置中真正在啟動並執行程式。它允許你在使用者使用時即時更新使用者介面。
多士通知(Toast Notification)– 無論程式是否在運行都會收到這個訊息,但在程式運行時彈出多士訊息可能會有點兒討人厭。我會在下面的例子中示範。多士通知不能更新你程式的資料。想做到這一點還是需要傳遞一個原生通知。
瓷磚通知(Tile Notification)– 如果你的程式被釘在了開始介面中,你可以用瓷磚通知來更新瓷磚。你可以改變背景圖片以及一個0-99的整數。
發送一個多士通知
一旦我們得到了推送URI,剩下的就是組合HTTP訊息的事了,然後將訊息發送給這個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開發人員訓練包上,並且跟著推播通知的例子完整地走一遍。
這是一個示範推播通知(從頭到尾)如何工作的絕佳例子,同時向你展示了這些更新可以讓你的應用程式總是保持在使用者眼前的強大力量。
下載範例程式碼
對於今天的例子來說,上面的代碼由於缺少所需的環境所以對你沒什麼協助。今天的下載內容實際上是Windows Phone開發人員訓練包中推播通知例子的最終版。
原文地址:http://www.jeffblankenburg.com/post/31-Days-of-Windows-Phone-7c-Day-19-Push-Notifications.aspx
如果大家喜歡我的文章,請點擊“推薦”,謝謝!