如何请求、创建和保存通知通道

你可以打开一个通道统一资源标识符 (URI),你的应用可以通过它接收推送通知。 然后,你可以将通道发送到你的服务器,该服务器使用它来发送推送通知,并在你不再需要它时将其关闭。 通道是一个唯一地址,代表单个设备上的单个用户,用于特定应用或辅助磁贴。

你应该在每次启动应用时请求一个新的通道,并在 URI 更改时更新云服务器。 有关更多详细信息,请参阅“备注”。

重要

通知通道会在 30 天后自动过期。

需要了解的事项

技术

  • Windows 运行时

先决条件

Instructions

步骤 1:添加命名空间声明

Windows.UI.Notifications 包括 toast 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 方法的不同调用并不总是返回不同的通道。 如果自上次调用以来通道没有更改,则你的应用应该通过不将相同的通道重新发送到你的服务来节省工作量和 Internet 流量。 一个应用可以同时具有多个有效的通道 URI。 因为每个唯一的通道在到期之前都保持有效,因此请求新的通道没有任何害处,因为它不会影响任何先前通道的到期时间。

通过在每次调用你的应用程序时请求一个新通道,你可以最大限度地利用有效通道的访问权限。 如果内容始终处于活动状态对于你的磁贴或 toast 场景至关重要,这一点尤其重要。 如果你担心用户可能不会每 30 天多次运行你的应用,你可以实现一个后台任务来定期执行你的通道请求代码。

处理通道请求中的错误

如果 Internet 不可用,则对 CreatePushNotificationChannelForApplicationAsync 方法的调用可能会失败。 要处理此问题,请将重试逻辑添加到步骤 2 中显示的代码中。 我们建议尝试 3 次,每次不成功尝试之间有 10 秒的延迟。 如果所有三次尝试都失败了,你的应用应该等到用户下次启动它时再试一次。

关闭通道

你的应用可以通过调用 PushNotificationChannel.Close 方法立即停止在所有通道上传递通知。 虽然你的应用经常会这样做,但在某些情况下,你可能希望停止向你的应用发送所有通知。 例如,如果你的应用具有用户帐户的概念并且用户退出该应用,则可以合理地预期该磁贴不再显示该用户的个人信息。 要成功清除内容磁贴并停止发送通知,应该执行以下操作:

  1. 通过在任何向用户发送磁贴、toast、徽章或原始通知的通知通道上调用 PushNotificationChannel.Close 方法来停止所有磁贴更新。 调用 Close 方法可确保不会向客户端传递该用户的进一步通知。
  2. 通过调用 TileUpdater.Clear 方法来清除磁贴的内容,以从磁贴中移除之前用户的数据。