Windows 推送服務(WNS)也是 Win10 通知機制中的一種,今天與你們一塊兒學習一下有關WNS的相關知識。使用 Windows 推送服務的前提是你須要有一個微軟開發者帳號,這樣才能獲得一些合法的密鑰信息用於與WNS服務器完成通信操做。windows
附上一張關於消息推送原理圖:服務器
(來自 MSDN )app
使用 PushNotificationChannelManager
中的 CreatePushNotificationChannelForApplicationAsync()
建立 PushNotificationChannel
對象,經過訂閱事件 PushNotificationReceived
接收 WNS 推送的消息。這裏須要主意的是,PushNotificationChannel
內的 Url
屬性。 WNS服務器怎麼才能知道消息該推送給誰,就是依賴 Url
屬性。學習
PushNotificationChannel pushNotificationChannel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync(); pushNotificationChannel.PushNotificationReceived += PushNotificationChannel_PushNotificationReceived;
private void PushNotificationChannel_PushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args) { if (args.NotificationType == PushNotificationType.Toast) { ToastNotificationManager.CreateToastNotifier().Show(args.ToastNotification); } }
這個過程分爲兩步進行:網站
瞭解OAuth認證的童鞋應該知道,咱們應該具備一些合法的密鑰信息,才能讓目標服務器信任咱們,而後咱們才能進行真正的請求。而與WNS打交道時全部的密鑰信息從哪來呢?這就須要微軟開發者帳號url
登陸微軟開發者網站,打開你的儀表盤(DashBoard),若是你尚未應用就先建立一個應用。在應用詳情裏選擇 服務 → 推送通知code
打開下圖中連接orm
看到了麼?這就是咱們須要的信息xml
在進行 OAuth 認證咱們須要 SID 與 Client_Id ,下面咱們模擬一下 AppService 與 WNS OAuth認證過程對象
HttpClient httpClient = new HttpClient(); Dictionary<string, string> @params = new Dictionary<string, string> { {"grant_type", "client_credentials"}, { "client_id", "ms-app://************* SID ********************" }, {"client_secret", "/********** Client Id *************"}, {"scope", "notify.windows.com"} }; HttpFormUrlEncodedContent httpFormUrlEncodedContent = new HttpFormUrlEncodedContent(@params); httpFormUrlEncodedContent.Headers["Content-Type"] = "application/x-www-form-urlencoded"; var response = await httpClient.PostAsync(new Uri("https://login.live.com/accesstoken.srf"), httpFormUrlEncodedContent); string content = await response.Content.ReadAsStringAsync();
認證成功後,能夠獲得 access_token ,這樣咱們的身份就合法了。
{ "access_token":"*****************/****************=", "token_type":"bearer" }
OAuth認證經過之後,就能夠向WNS發送真正的推送請求了。下面咱們模擬一下 AppService 是如何給 Client 推送 Toast消息。
HttpClient httpClient2 = new HttpClient(); HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri(ChannelUrl)); httpRequestMessage.Headers.Add("Authorization", "Bearer " + access_token); httpRequestMessage.Headers.Add("X-WNS-Type", "wns/toast"); string toastContent = @" <toast> <visual> <binding template='ToastGeneric'> <text>Hello World!</text> <text>This is the first Example!</text> </binding> </visual> </toast>"; HttpStringContent httpStringContent = new HttpStringContent(toastContent); httpStringContent.Headers["Content-Type"] = "text/xml"; httpStringContent.Headers["Content-Length"] = Encoding.UTF8.GetBytes(toastContent.ToCharArray()).Length.ToString(); httpRequestMessage.Content = httpStringContent; var response2 = await httpClient.SendRequestAsync(httpRequestMessage);
該注意的是 ChannelUrl
就是客戶端在建立 PushNotificationChannel
對象中的 Url
的值。請求成功後,WNS就會根據Url
推送給與之對應的客戶端。
到此爲止,咱們已經實現一個遠程推送的 DEMO。固然 WNS 裏還有許多知識沒有說起到,好比除了Toast
通知外,咱們能夠推送Tile
等其餘類型的通知。推薦你們去仔細閱讀一下官方的說明文檔,後續我也會補充WNS額外的內容。