Windows Push Notification Service (WNS) 是 Windows 8 內建的推播基礎設施,允許雲端伺服器主動將 Toast、Tile、Badge 或 Raw 通知傳送至裝置。本文涵蓋客戶端通道建立、背景任務處理、伺服端 OAuth 認證與通知發送的完整流程。
在 Package.appxmanifest 加入「背景工作」宣告,勾選「推播通知」。應用必須被使用者加入鎖屏,才能在鎖屏狀態下觸發 Raw 通知背景任務。
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 傳送給伺服端
}
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)
}
}
WNS 使用 OAuth 2.0 Client Credentials Flow。需向 https://login.live.com/accesstoken.srf POST 表單:
grant_type=client_credentialsclient_id(套件 SID)client_secret(客戶端密鑰)scope=notify.windows.com回傳 JSON 包含 access_token 與 token_type(通常為 "bearer")。
對 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/rawX-WNS-RequestForStatus:true 可取得詳細狀態碼Body 為對應 XML 負載(Toast/Tile/Badge)或任意二進位資料。
[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;
}
}
}
<toast>
<visual>
<binding template="ToastText01">
<text id="1">Hello WNS!</text>
</binding>
</visual>
</toast>
Raw 通知無預設 UI,適合觸發背景任務或應用內邏輯。Body 可為任意字串(如 JSON)。
Package.appxmanifest,否則 WNS 會拒絕。401 表示 Token 過期需重新取得;404/410 表示 Channel 已失效,應移除該訂閱;406 表示節流,需指數退避重試。PushNotificationReceived 事件。WNS 推播通知是 Windows 8 應用實現即時觸達的核心機制。掌握客戶端 Channel 管理、伺服端 OAuth 流程與各類通知 XML 格式,即可建構可靠的推播系統。建議將伺服端發送邏輯封裝為獨立服務,並實作重試、日誌與監控機制。