[Win10應用開發] 使用 Windows 推送服務

前言

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 認證
  • 推送消息請求

瞭解OAuth認證的童鞋應該知道,咱們應該具備一些合法的密鑰信息,才能讓目標服務器信任咱們,而後咱們才能進行真正的請求。而與WNS打交道時全部的密鑰信息從哪來呢?這就須要微軟開發者帳號url

登陸微軟開發者網站,打開你的儀表盤(DashBoard),若是你尚未應用就先建立一個應用。在應用詳情裏選擇 服務推送通知code

打開下圖中連接orm

看到了麼?這就是咱們須要的信息xml

在進行 OAuth 認證咱們須要 SIDClient_Id ,下面咱們模擬一下 AppServiceWNS 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額外的內容。

參考連接

Windows 推送通知服務 (WNS) 概述
推送通知服務請求和響應頭

相關文章
相關標籤/搜索