如何使用 WNS 將原始推播通知傳遞到鎖定畫面應用程式 (HTML)
[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]
本主題說明 如何在 Windows 執行階段應用程式中的鎖定畫面上,使用 Windows 通知服務 (WNS) 和原始推播通知接收背景中的網路通知。本主題逐步介紹登錄推播通知通道和傳送到伺服器的程序、登錄背景工作以便從原始推播通知啟用,以及將原始推播通知傳送到通道並啟用背景工作。
您必須知道的事
技術
Windows.Networking.PushNotifications
使用原始推播通知啟用背景網路通訊。
先決條件
下列資訊適用於依賴使用原始推播通知維持網路連線的任何已連線或網路感知 Windows 執行階段應用程式。這個主題適用於 Windows 8.1、Windows Phone 8.1 和 Windows Server 2012 R2 上使用 JavaScript 撰寫的應用程式。
JavaScript 應用程式、以 C++/XAML 撰寫的應用程式,以及使用 C#、VB.NET 或 Managed C++ 之 .NET Framework 4.5 的應用程式,可支援使用原始推播通知的背景網路連線。 如需適用於 JavaScript 應用程式的背景網路工作詳細資訊,請參閱使用背景工作支援應用程式。
指示
使用 WNS 將原始推播通知傳送到鎖定畫面應用程式
使用 WNS 的應用程式不需要執行,也可以接收推播通知,而且即使沒有執行,使用者也會覺得應用程式正在執行中。例如,天氣應用程式總是可以更新動態磚來顯示最新的天氣。WNS 也可以在發生重大事件時,傳送螢幕通知給使用者。新聞快報事件正是螢幕通知的最佳範例之一。執行 Windows 8.1、Windows Phone 8.1 或 Windows Server 2012 R2 且連線到網際網路的所有裝置都可以使用 WNS。這些 WNS 通知通常可以在傳送後立即送出。
雖然 WNS 可以協助支援 Windows 8.1 [開始] 畫面上的動態磚與通知,但也可用來啟用即時連線案例,例如 IM、VoIP 與電子郵件。將使用 WNS 的應用程式新增到鎖定畫面時,則可用來啟用背景工作。背景工作是應用程式程式碼的一部分,當應用程式在背景時 (不再出現於前景) 就會執行該程式碼。
一些可由 WNS 通知啟用的背景工作範例,如下所示:
- 呼叫通知徽章 API 可增量鎖定畫面上電子郵件應用程式的徽章圖示,以指出新電子郵件訊息已送達。
- 呼叫修改快顯通知 API 可引發 VoIP 應用程式的通知,傳送訊號讓使用者知道有來電。
推播通知有四種類型:
- 磚更新
- 徽章更新
- 快顯通知
- 原始通知
所有 Windows 執行階段應用程式都可在前景時使用前三個推播通知。只有鎖定畫面應用程式可以收到 WNS 的原始推播通知。當原始推播通知從 WNS 送達時,原始通知可讓鎖定畫面應用程式以背景工作的形式執行程式碼,即使應用程式不在前景也是如此。
大部分的應用程式都不需要是鎖定畫面應用程式,而且不必在鎖定畫面就可以使用 WNS。所有應用程式都可以使用 WNS 來更新磚與徽章,並在前景時引發快顯通知。在鎖定畫面應用程式使用 WNS,是使用 WNS 啟動動態磚並引發使用者通知的進階功能版本。開發人員應該在嘗試將 WNS 與鎖定畫面搭配使用之前,先熟悉 MSDN 上的 WNS 文件。如需詳細資訊,請參閱推播通知概觀。
您將需要已經透過 Windows 市集佈建的祕密金鑰,傳送推播通知給 WNS。如需使用 WNS 進行驗證和設定您的應用程式的詳細資訊,請參閱如何使用 Windows 推播通知服務 (WNS) 進行驗證。
下列步驟顯示如何將原始推播通知傳送到鎖定畫面應用程式。
- 登錄 WNS 推播通知通道並將它傳送給伺服器。
- 使用通知通道將正確格式的原始推播通知傳送給 WNS。
- 撰寫原始推播通知啟用的背景工作。
在通知通道執行語式正確的 XML 裝載 HTTP PUSH,透過使用開發人員應用程式伺服器,將原始推播通知傳遞到用戶端應用程式。通知通道是由用戶端應用程式所產生,會將它傳送到應用程式伺服器,並用以傳送推播通知。通知通道對於在 Windows 8.1 中使用者帳戶上的應用程式執行個體而言是唯一的。
登錄推播通知通道並將它傳送給伺服器。
在 Windows.Networking.PushNotifications 命名空間中呼叫 PushNotificationChannelManager 類別的其中一個 CreatePushNotificationChannelForApplicationAsync 方法,以登錄通道。
這樣會產生應用程式的推播通知通道,看起來像這樣:
https://db3.notify.windows.com/?token=AQQAAADX3Wr8MA%2fCoZk4n1CmR5ZU7tdic6ksvG4TQq1tiyZtpetjfzuPHSjvliEeqaqJcPuo1jrVnbyCZvnbuU%2byLvZNDONTgUNu6lavpl5EGtWx7iQgpGkyHLbZeosxioQ42Cg%3d
將通道傳送到伺服器。通道會在 30 天後過期,因此下列為最佳做法:
- 進行登錄以便在每次應用程式啟動時,取得新的推播通知通道,並將該通道傳送到伺服器,以取代之前繫結到使用者的通道。
- 對於不斷電的本機電腦,在通道到期之前,每過一段時間就執行背景工作一次以更新通道。這又稱為維護計時器。
登錄背景工作,以便從原始推播通知啟用。
若要建立收到原始推播通知後執行的背景工作,您必須指定包含背景工作要啟用之程式碼的 JavaScript 原始檔。若要這樣做,您必須確定應用程式資訊清單指向背景工作的原始檔。應用程式資訊清單必須包含背景工作的 JavaScript 原始檔名稱。
下列範例會在應用程式資訊清單的 <Application> 元素下,新增 PushNotifyTask 背景工作的延伸。
<Extensions> <Extension Category="windows.backgroundTasks" StartPage="js\backgroundTask.js"> <BackgroundTasks> <Task Type="pushNotification" /> </BackgroundTasks> </Extension> </Extensions>
應用程式必須開啟原始推播通知的通道。
下列範例顯示如何開啟原始推播通知的通道。
// Open the channel. See the "Push and Polling Notifications" sample for more detail function openNotificationsChannel() { var channelOperation = pushNotifications.PushNotificationChannelManager.createPushNotificationChannelForApplicationAsync(); WinJS.log && WinJS.log("Opening a channel...", "sample", "status"); return channelOperation.then(function (newChannel) { WinJS.log && WinJS.log("Channel request succeeded!", "sample", "status"); document.getElementById("scenario1ChannelOutput").value = newChannel.uri; SdkSample.channel = newChannel; }, function (error) { WinJS.log && WinJS.log("Could not create a channel (error number: " + error.number + ")", "sample", "error"); } ); }
應用程式也必須登錄背景工作,以便在收到原始推播通知後啟用背景工作。
下列範例顯示如何登錄原始推播通知的背景工作。
// Register the background task for raw notifications // function registerBackgroundTask() { var taskBuilder = new background.BackgroundTaskBuilder(); var trigger = new background.PushNotificationTrigger(); taskBuilder.setTrigger(trigger); taskBuilder.taskEntryPoint = sampleTaskEntryPoint; taskBuilder.name = sampleTaskName; try { var task = taskBuilder.register(); task.addEventListener("completed", backgroundTaskComplete); WinJS.log && WinJS.log("Background task registered", "sample", "status"); } catch (e) { WinJS.log && WinJS.log("Registration error: " + e.message, "sample", "error"); unregisterBackgroundTask(); } } function unregisterBackgroundTask() { var iter = background.BackgroundTaskRegistration.allTasks.first(); while (iter.hasCurrent) { var task = iter.current.value; if (task.name === sampleTaskName) { task.unregister(true); return true; } iter.moveNext(); } return false; }
您也需要提供在觸發背景工作時要執行的函式程式碼。
如需如何撰寫背景工作以接收使用原始推播通知的背景網路通知的詳細資訊,請參閱如何撰寫原始推播通知的背景工作。
注意
您無法在背景工作參照應用程式使用者介面 (UI) 的元素,因為應用程式的 UI 元素並未執行。這表示網路傳輸的任何回呼都不能與 UI 單一執行緒 Apartment (STA) 有親和性。背景工作不得存取任何與 UI STA (又稱為應用程式 STA) 有親和性的物件。
在背景工作執行程式碼時,可以設定要啟用的應用程式,同步化用戶端與伺服器之間的狀態,並向使用者引發通知。
原始推播通知與徽章與磚通知很類似。主要的差異在於原始推播通知的裝載並不包含更新部分 Windows 8.1 使用者介面的屬性。原始推播通知的裝載全部都是啟用背景工作後直接傳遞到您應用程式的內容資料。您的應用程式必須理解伺服器傳送的內容資料格式。
您必須先執行下列動作,伺服器才能傳送原始推播通知:
將原始推播通知傳送到通道並啟用背景工作
請確定您已在 Windows 市集中登錄您的應用程式,且具有私密金鑰與封裝 SID。
在應用程式伺服器上撰寫程式碼,以便在從伺服器傳送推播通知之前,使用私密金鑰與套件 SID 進行 WNS 驗證。
正確建立 WNS 原始推播通知,並對您之前從 Windows 執行階段應用程式收到的通知通道執行 HTTP POST。HTTP POST 應該包括一些其他 HTTP 標頭:
- X-WNS-Type=wns/raw
- Content-Type=application/octet-stream
- Authorization=字串 “Bearer” 加空格,然後加上從驗證步驟中取得的驗證權杖
當 HTTP POST 執行因收到原始推播通知而觸發的背景工作時,其主體必須包含您要提供給用戶端應用程式的所有內容。原始通知裝載可容納的資料量上限是 5KB。
當用戶端收到通知時,會啟用背景工作,並透過應用程式背景工作程式碼將指定的資料裝載傳遞進來,並進行存取。
前置步驟
如需如何建立鎖定畫面應用程式以接收使用原始推播通知的背景網路通知的詳細資訊,請參閱快速入門:建立使用背景原始推播通知的鎖定畫面應用程式。
後續步驟
如需如何撰寫背景工作以接收使用原始推播通知的背景網路通知的詳細資訊,請參閱如何撰寫原始推播通知的背景工作。
如需使用原始推播通知的指導方針和檢查清單的詳細資訊,請參閱
相關主題
其他資源
如何使用 Windows 推播通知服務 (WNS) 進行驗證
參考
Windows.ApplicationModel.Background
Windows.Networking.BackgroundTransfer
Windows.Networking.PushNotifications
範例