Запрос, создание и сохранение канала уведомлений

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

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

Важно!

Срок действия каналов уведомлений автоматически истекает через 30 дней.

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

Технологии

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

Предварительные требования

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 , чтобы удалить данные предыдущего пользователя из плитки.