可以打开通道统一资源标识符(URI),应用可以通过该通道接收推送通知。 然后,可以将通道发送到使用它发送推送通知的服务器,并在不再需要推送通知时将其关闭。 通道是一个唯一地址,表示单个设备上的单个用户,用于特定应用或辅助磁贴。
每次启动应用时,都应请求一个新通道,并在 URI 更改时更新云服务器。 有关详细信息,请参阅“备注”。
重要
通知通道会在 30 天后自动过期。
需要了解的内容
技术
- Windows 运行时
先决条件
- 熟悉推送通知和 Windows 推送通知服务(WNS)的概念、要求和操作。 Windows 推送通知服务(WNS)概述中对此进行了讨论。
说明书
步骤 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.
}
注解
请求通道
每次调用应用时,应使用以下逻辑请求新通道:
- 请求频道。
- 将新频道与以前的频道进行比较。 如果通道相同,则无需采取任何进一步操作。 请注意,这要求应用每次成功将通道发送到服务时,需将其存储在本地,以便可以在以后进行比较。
- 如果通道已更改,请将新通道发送到 Web 服务。 在以下情况中,加入始终发送新通道的错误处理逻辑:
- 你的应用以前从未向 Web 服务发送过通道。
- 应用最后一次尝试将通道发送到 Web 服务未成功。
CreatePushNotificationChannelForApplicationAsync 方法的不同调用并不总是返回不同的通道。 如果自上次调用以来通道未更改,应用应通过不向服务重新发送同一通道来节省工作量和 Internet 流量。 应用可以同时具有多个有效的通道 URI。 由于每个唯一通道在过期前保持有效,因此请求新通道不会造成任何损害,因为它不会影响任何以前的通道的到期时间。
每次调用应用时,通过请求新通道,可以尽可能提高获得有效通道的机会。 如果磁贴或 Toast 方案必须始终实时显示内容,则这一点尤其重要。 如果担心用户可能每 30 天不超过一次运行您的应用,则可以实现后台任务,以定期执行通道请求代码。
处理通道请求中的错误
如果 Internet 不可用,对 CreatePushNotificationChannelForApplicationAsync 方法的调用可能会失败。 若要处理此问题,请将重试逻辑添加到步骤 2 中显示的代码。 建议每次不成功的尝试之间间隔10秒,总共尝试三次。 如果这三次尝试都失败,你的应用应等到用户下次启动它以重试。
关闭通道
应用可以通过调用 PushNotificationChannel.Close 方法立即停止在所有通道上传递通知。 虽然应用这样做并不常见,但在某些情况下,你可能希望停止向应用发送所有通知。 例如,如果应用具有用户帐户的概念,并且某个用户注销该应用,则预计磁贴不再显示该用户的个人信息是合理的。 若要成功清除内容的磁贴并停止传递通知,应执行以下作:
- 通过在向用户传送磁贴、Toast、徽章或原始通知的任何通知通道上调用 PushNotificationChannel.Close 方法来停止所有磁贴更新。 调用 Close 方法可确保无法向客户端传递该用户的进一步通知。
- 通过调用 TileUpdater.Clear 方法从磁贴中删除以前的用户数据,清除磁贴的内容。