首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Windows 8 Store Apps 開發指南 (67):WNS 推播通知完整實作(客戶端與伺服端)

     編輯:關於.NET

前言

Windows Push Notification Service (WNS) 是 Windows 8 內建的推播基礎設施,允許雲端伺服器主動將 Toast、Tile、Badge 或 Raw 通知傳送至裝置。本文涵蓋客戶端通道建立、背景任務處理、伺服端 OAuth 認證與通知發送的完整流程。

客戶端實作

1. 宣告背景任務與鎖屏權限

在 Package.appxmanifest 加入「背景工作」宣告,勾選「推播通知」。應用必須被使用者加入鎖屏,才能在鎖屏狀態下觸發 Raw 通知背景任務。

2. 建立推播通道

private async void btnCreateChannel_Click(object sender, RoutedEventArgs e) {
    var status = BackgroundExecutionManager.GetAccessStatus();
    if (status == BackgroundAccessStatus.Unspecified) {
        status = await BackgroundExecutionManager.RequestAccessAsync();
    }
    if (status == BackgroundAccessStatus.Denied) {
        await new MessageDialog("請先將此 App 加入鎖屏").ShowAsync();
        return;
    }

    var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    channel.PushNotificationReceived += channel_PushNotificationReceived;
    txtUri.Text = channel.Uri; // 將 Channel URI 傳送給伺服端
}

3. 處理接收到的通知

void channel_PushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args) {
    // 依通知類型處理:Toast, Tile, Badge, Raw
    if (args.NotificationType == PushNotificationType.Raw) {
        var raw = args.RawNotification;
        string payload = raw.Content;
        // 可在這裡更新 UI 或寫入本地儲存
        args.Cancel = true; // 取消預設 UI 顯示(若為 Raw)
    }
}

伺服端實作

1. OAuth 取得 Access Token

WNS 使用 OAuth 2.0 Client Credentials Flow。需向 https://login.live.com/accesstoken.srf POST 表單:

  • grant_type=client_credentials
  • client_id(套件 SID)
  • client_secret(客戶端密鑰)
  • scope=notify.windows.com

回傳 JSON 包含 access_token 與 token_type(通常為 "bearer")。

2. 發送通知

對 Channel URI 發送 HTTP POST,Headers 包含:

  • Authorization: Bearer <access_token>
  • Content-Type:依通知類型設定(如 text/xml 或 application/octet-stream)
  • X-WNS-Type:wns/toast, wns/tile, wns/badge, wns/raw
  • X-WNS-RequestForStatus:true 可取得詳細狀態碼

Body 為對應 XML 負載(Toast/Tile/Badge)或任意二進位資料。

3. 關鍵輔助類別

[DataContract]
public class OAuthToken {
    [DataMember(Name="access_token")] public string AccessToken { get; set; }
    [DataMember(Name="token_type")] public string TokenType { get; set; }
}

public class OAuthHelper {
    public static async Task<string> GetAccessTokenAsync(string secret, string sid) {
        using (var client = new HttpClient()) {
            var values = new Dictionary<string,string> {
                {"grant_type","client_credentials"},
                {"client_id",sid},
                {"client_secret",secret},
                {"scope","notify.windows.com"}
            };
            var resp = await client.PostAsync("https://login.live.com/accesstoken.srf", new FormUrlEncodedContent(values));
            var json = await resp.Content.ReadAsStringAsync();
            var token = JsonConvert.DeserializeObject<OAuthToken>(json);
            return token.AccessToken;
        }
    }
}

通知類型與 XML 範例

Toast 通知

<toast>
  <visual>
    <binding template="ToastText01">
      <text id="1">Hello WNS!</text>
    </binding>
  </visual>
</toast>

Raw 通知

Raw 通知無預設 UI,適合觸發背景任務或應用內邏輯。Body 可為任意字串(如 JSON)。

最佳實踐與注意事項

  1. Channel 有效期 30 天:建議每次 App 啟動時重新建立 Channel,並將新 URI 上傳伺服端。
  2. 不可在模擬器測試:需實體裝置或遠端桌面連線實體機。
  3. 身分識別同步:發布至 Store 後,必須將 Store 產生的 Package Identity 複製回 Package.appxmanifest,否則 WNS 會拒絕。
  4. 錯誤碼處理:401 表示 Token 過期需重新取得;404/410 表示 Channel 已失效,應移除該訂閱;406 表示節流,需指數退避重試。
  5. Raw 通知需鎖屏權限:否則僅在前景時觸發 PushNotificationReceived 事件。

總結

WNS 推播通知是 Windows 8 應用實現即時觸達的核心機制。掌握客戶端 Channel 管理、伺服端 OAuth 流程與各類通知 XML 格式,即可建構可靠的推播系統。建議將伺服端發送邏輯封裝為獨立服務,並實作重試、日誌與監控機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved