添加徽章通知
磁貼通知使Metro應用可以更新磁貼的內容,包括主磁貼和次要磚,即使應用當前沒有運行也可以更新。徽章通知是一種特殊的磁貼通知,它更新的是磁貼的徽章,這是在磁貼上預定位置上顯示的從0-99的數字或者一個特殊符號(例如*號)。徽章通知來源於Windows通知服務對應用雲端式的服務調用的響應。在這個練習中,您將在ContosoCookbook中添加一個簡單的徽章通知,再有新的菜譜時通知使用者。
任務1 – 修改應用資訊清單檔
Microsoft已經部署了一個Contoso Cookbook可以調用並訂閱徽章通知的Windows Azure 服務,並通過WNS傳遞通知。在服務部署的時候,它被配置成只向來自特定發行人(Contoso)的擁有特定包名的應用傳遞通知。為了收到這個服務發送的徽章通知,您需要修改應用資訊清單檔,使用正確的包名稱和發行人ID。
1. 在方案總管中,雙擊package.appxmanifest開啟資訊清單檔。
2. 在清單編輯器中,點擊“Packaging”選項卡。
3. 將Package Name修改為“BUILD.55aac983-908e-4a91-8d5f-ce6cf8d3125e”。
4. 將Publisher Display Name修改為“Contoso”。
5. 點擊“Publisher”行中的“Choose Certificate”按鈕。然後從“ConfigureCertificate”下拉框中選擇“Selectfrom file…”,並在確認對話方塊中選擇“Contoso.pfx”。Contoso.pfx在原始材料的certs檔案夾中。然後點擊“OK”按鈕。
6. 確認Package Name、Publisher、PublisherDisplay Name中的內容,3所示。
圖3
編輯好的清單
7. 儲存修改,關閉package.appxmanifest。
任務2 – 訂閱徽章通知
要訂閱徽章通知,Metro應用要從Metro運行時擷取一個通知通道,並將通道的URI傳遞給服務。當服務要更新鎖定屏提醒時,就使用通道的URI調用WNS,WNS就會將徽章通知傳遞給應用。我們準備在ContosoCookbook啟動的時候得到一個通道URI,並用它訂閱徽章通知。
1. 開啟default.js,找到app.onactivated函數。
2. 緊接在注釋“Initialize your applicationhere”之後,在函數中添加以下語句,在應用每次啟動的時候訂閱徽章通知:
JavaScript
// Register for badgenotification
Windows.Networking.PushNotifications.PushNotificationChannelManager.createPushNotificationChannelForApplicationAsync().then(function(channel) {
// Base-64 encode the channel URI so it can be passed in a query string
varwsc = Windows.Security.Cryptography;
var buffer =wsc.CryptographicBuffer.convertStringToBinary(channel.uri,wsc.BinaryStringEncoding.utf8);
varuri =wsc.CryptographicBuffer.encodeToBase64String(buffer);
// Pass the encoded channel URI to the Contoso Cookbook service
WinJS.xhr({ url: "http://ContosoRecipes8.cloudapp.net?uri="+ uri }).then(function (xhr) {
if (xhr.status< 200 || xhr.status>= 300) {
var dialog = new Windows.UI.Popups.MessageDialog("Unable to openpush notification channel");
dialog.showAsync();
}
});
});
注意:對createPushNotificationChannelForApplicationAsync的調用從Metro請求一個通知通道。在這個樣本中,用base-64對通道URI進行編碼,以便在查詢字串中將URI傳遞給菜譜服務。Base-64編碼次不是必須使用的,但它可以防止URI中包含一些在查詢字串中需要進行base-64編碼的可能性。
WinJS.xhr用來觸發對WindowsAzure上託管的菜譜服務的調用,並傳遞通道URI。這個服務保持訂閱了它的服務的所有用戶端(URI)的記錄,在一個小時內每隔60秒觸發向這些用戶端的徽章通知一次。傳遞給服務的每個通道URI都代表在某台具體裝置上啟動並執行具體應用。服務會對通道URIL進行“除冗”操作,這樣如果ContosoCookbook多次傳遞了相同的通道URI,也不會收到多個徽章更新。如果服務收到相同的通道URI,則會“重新整理”通道,這樣對應的應用會在接下來的60分鐘內繼續收到徽章通知。
3. 在上一步添加的代碼之前添加以下語句,在應用每次啟動的時候清除徽章通知:
JavaScript
// Clear the badge
Windows.UI.Notifications.BadgeUpdateManager.createBadgeUpdaterForApplication().clear();
注意:應用開始接收徽章通知之後,在應用的主磁貼上就會出現一個數字。預設情況下,這個數字(或稱徽章)永不消失。剛剛添加的語句使用Windows運行時的BadgeUpdater.clear方法在磁貼上清除徽章。因為應用不用運行也能接收到徽章通知,所以可以在不運行應用的情況下測試徽章通知,如果想清除徽章,只需要再次運行應用即可。
任務3 – 測試徽章通知
最後一步就是確保應用確實接收到了傳遞給它的徽章通知。
1. 按F5在調試器中啟動應用程式。在現在的啟動過程中,應用會訂閱徽章通知。
2. 返回Visual Studio並停止調試,關閉應用。
3. 回到Metro開始畫面,找到應用的主磁貼。
4. 觀察磁貼一段時間。在60秒內,上面就應該出現一個數字,4所示。從概念上講,這個數字代表可用的新菜譜數量。在實際中,它只是這個小時過去的分鐘數。
圖4
主磁貼上顯示徽章
5. 繼續觀察磁貼2-3分鐘,確認徽章每60秒增加一次。
6. 從Visual Studio中再次運行應用。
7. 回到Metro開始畫面,確認徽章已經從磁貼上消失。(接下來60秒內會再次出現,但徽章消失表示應用每次啟動時執行的BadgeUpdater.clear調用起作用了。)
8. 返回VisualStudio並停止調試。
注意:本文章為msdn上windows8線上實驗的指令碼,僅供學習參考。如果想體驗完整實驗可以點擊以下msdn的線上實驗室
http://msdn.microsoft.com/zh-cn/hh968278