Поделиться через


Как запрашивать, создавать и сохранять канал уведомлений

Вы можете открыть универсальный идентификатор ресурса канала (URI), по которому приложение может получать push-уведомления. Затем канал можно отправить на сервер, который использует его для отправки push-уведомлений, и закрыть его, когда он больше не нужен. Канал — это уникальный адрес, представляющий одного пользователя на одном устройстве для определенного приложения или вторичной плитки.

При каждом запуске приложения необходимо запросить новый канал и обновить облачный сервер при изменении URI. Дополнительные сведения см. в разделе Комментарии.

Внимание

Каналы уведомлений автоматически истекают через 30 дней.

Это важно знать

Технологии

  • Среда выполнения Windows

Необходимые компоненты

  • Знакомство с понятиями, требованиями и операцией служб push-уведомлений Windows (WNS). Они рассматриваются в обзоре служб push-уведомлений Windows (WNS).

Instructions

Шаг 1. Добавление объявлений пространства имен

Windows.UI.Notifications включает всплывающие API.

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

Шаг 2. Запрос URI канала

В этом примере запрашивает URI канала. Запрос выполняется на клиентской платформе уведомлений, которая, в свою очередь, запрашивает URI канала из WNS. После завершения запроса возвращаемое значение представляет собой объект PushNotificationChannel , содержащий URI.

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. Если канал изменился, отправьте новый канал в веб-службу. Включите логику обработки ошибок, которая всегда отправляет новый канал в следующих случаях:
    • Ваше приложение никогда не отправляло канал в веб-службу раньше.
    • Последняя попытка приложения отправить канал в веб-службу не была успешной.

Различные вызовы метода CreatePushNotificationChannelForApplicationAsync не всегда возвращают другой канал. Если канал не изменился с момента последнего вызова, ваше приложение должно сохранять усилия и интернет-трафик, не перенаправляя этот же канал в службу. Приложение может одновременно иметь несколько допустимых URI каналов. Так как каждый уникальный канал остается допустимым до истечения срока действия, то при запросе нового канала нет вреда, так как он не влияет на время истечения срока действия всех предыдущих каналов.

Запрашивая новый канал при каждом вызове приложения, вы максимально повышаете вероятность постоянного доступа к допустимому каналу. Это особенно важно, если это жизненно важно для вашего плитки или всплывающего сценария, что содержимое всегда будет жить. Если вы обеспокоены тем, что пользователь может не запускать приложение более одного раза в 30 дней, можно реализовать фоновую задачу для регулярного выполнения кода запроса канала.

Обработка ошибок в запросах канала

Вызов метода CreatePushNotificationChannelForApplicationAsync может завершиться ошибкой, если Интернет недоступен. Для этого добавьте логику повторных попыток в код, показанный на шаге 2. Мы рекомендуем три попытки с 10-секундной задержкой между каждой неудачной попыткой. Если все три попытки завершаются ошибкой, приложение должно дождаться следующего запуска приложения, чтобы повторить попытку.

Закрывающие каналы

Приложение может немедленно остановить доставку уведомлений во всех каналах, вызвав метод PushNotificationChannel.Close. Хотя это не будет распространено для вашего приложения, могут возникнуть определенные сценарии, в которых вы хотите остановить всю доставку уведомлений в приложение. Например, если ваше приложение имеет концепцию учетных записей пользователей и пользователь выходит из этого приложения, разумно ожидать, что плитка больше не отображает личную информацию пользователя. Чтобы успешно очистить плитку содержимого и остановить доставку уведомлений, сделайте следующее:

  1. Остановите все обновления плиток, вызвав метод PushNotificationChannel.Close на любом из каналов уведомлений, которые предоставляют плитку, всплывающее уведомление, индикатор или необработанные уведомления пользователю. Вызов метода Close гарантирует, что никакие дополнительные уведомления для этого пользователя не могут быть доставлены клиенту.
  2. Снимите содержимое плитки, вызвав метод TileUpdater.Clear , чтобы удалить данные предыдущего пользователя из плитки.