如何要求、建立及儲存通知通道

您可以開啟通道統一資源識別元 (URI),讓應用程式可以透過它接收推播通知。 接著您可以將通道傳送至伺服器,伺服器會用它來傳送推播通知,並且在您不再需要時將它關閉。 通道是特定應用程式或次要磚的唯一位址,代表單一裝置上的單一使用者。

每次應用程式啟動時,您都應該要求新的通道,並在 URI 變更時更新雲端伺服器。 如需詳細資訊,請參閱備註。

重要

通知通道會在 30 天後自動到期。

須知事項

技術

  • Windows 執行階段

必要條件

指示

步驟 1:新增命名空間宣告

Windows.UI.Notifications 包含快顯 API。

using Windows.UI.Notifications;
using Windows.Data.Xml.Dom;
using Windows.Networking.PushNotifications;

步驟 2:要求通道 URI

此範例會要求通道 URI。 要求是向通知用戶端平台提出,而此平台接著會向 WNS 要求通道 URI。 要求完成時,傳回的值會是包含 URI 的 PushNotificationChannel 物件。

PushNotificationChannel channel = null;

try
{
    channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
}

catch (Exception ex)
{ 
    // Could not create a channel. 
}

步驟 3:將通道 URI 傳送至您的伺服器

通道 URI 會封裝在 HTTP POST 要求中,並傳送至伺服器。

重要

您應該採用安全的方式將此資訊傳送至您的伺服器。 您應要求應用程式在傳輸通道 URI 時,向伺服器進行自我驗證。 加密資訊並使用安全的通訊協定,例如 HTTPS。

String serverUrl = "http://www.contoso.com";

// Create the web request.
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(serverUrl);
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
byte[] channelUriInBytes = System.Text.Encoding.UTF8.GetBytes("ChannelUri=" + channel.Uri);

// Write the channel URI to the request stream.
Stream requestStream = await webRequest.GetRequestStreamAsync();
requestStream.Write(channelUriInBytes, 0, channelUriInBytes.Length);

try
{
    // Get the response from the server.
    WebResponse response = await webRequest.GetResponseAsync();
    StreamReader requestReader = new StreamReader(response.GetResponseStream());
    String webResponse = requestReader.ReadToEnd();
}

catch (Exception ex)
{
    // Could not send channel URI to server.
}

備註

要求通道

每次叫用應用程式時,您都應該使用下列邏輯來要求新的通道:

  1. 通道要求。
  2. 比較新通道與舊通道。 如果通道相同,則不需要執行任何進一步的動作。 請注意,每次應用程式成功將通道傳送至您的服務時,您的應用程式都須將通道儲存在本機上,方便您稍後進行通道比較。
  3. 如果通道已變更,請將新的通道傳送至您的 Web 服務。 在下列情況下,請包含一律傳送新通道的錯誤處理邏輯:
    • 您的應用程式未曾將通道傳送至 Web 服務。
    • 您的應用程式上次嘗試將通道傳送至 Web 服務未成功。

CreatePushNotificationChannelForApplicationAsync 方法的不同呼叫,不一定會傳回不同的通道。 如果通道自上次呼叫後並未變更,您的應用程式應該不會將相同的通道重新傳送至您的服務,以節省勞力和網際網路流量。 應用程式可同時擁有多個有效的通道 URI。 由於每個唯一通道在到期前都會保持有效,因此要求新通道並無任何影響,因為它不會影響任何舊通道的到期時間。

藉由每次叫用應用程式時都要求新的通道,就可確保永遠能夠存取有效的通道。 如果您的磚或快顯情境一律要求即時內容,則這樣做特別重要。 如果您擔心使用者執行您應用程式的頻率可能不會超過每隔 30 天一次,您可以實作背景工作來定期執行通道要求程式碼。

處理通道要求中的錯誤

如果無法連線到網際網路,對 CreatePushNotificationChannelForApplicationAsync 方法的呼叫可能會失敗。 若要處理這個問題,請將重試邏輯新增至步驟 2 中顯示的程式碼。 我們建議三次嘗試,且每次嘗試失敗後延遲 10 秒。 如果這三次嘗試都失敗,您的應用程式應等到下一次使用者再次啟動它時再重試。

關閉通道

您的應用程式可以藉由呼叫 PushNotificationChannel.Close 方法,立即停止在所有通道上傳遞通知。 雖然應用程式不常這樣做,但在某些情況下,您可能會想要停止所有通知傳遞至您的應用程式。 例如,如果您的應用程式具有使用者帳戶的概念,且使用者登出該應用程式,則可合理預期磚不再顯示該使用者的個人資訊。 若要成功清除磚的內容並停止傳遞通知,您應執行下列動作:

  1. 在傳遞磚、快顯、徽章或原始通知至使用者的任何通知通道上,呼叫 PushNotificationChannel.Close 方法以停止所有磚更新。 呼叫 Close 方法可確保用戶端不會收到該使用者的進一步通知。
  2. 呼叫 TileUpdater.Clear 方法來清除磚中的內容,以移除磚內先前使用者的資料。