Compartir a través de


Cómo solicitar, crear y guardar un canal de notificación

Puedes abrir un identificador uniforme de recursos (URI) de canal en el que la aplicación puede recibir notificaciones push. Después, puede enviar el canal al servidor que lo usa para enviar notificaciones push y cerrarlo cuando ya no lo necesite. Un canal es una dirección única que representa un único usuario en un único dispositivo, para una aplicación específica o un icono secundario.

Debe solicitar un nuevo canal cada vez que se inicie la aplicación y actualizar el servidor en la nube cuando cambie el URI. Para obtener más información, consulte Comentarios.

Importante

Los canales de notificación expiran automáticamente después de 30 días.

Lo que necesita saber

Tecnologías

  • Windows en tiempo de ejecución

Requisitos previos

Instrucciones

Paso 1: Agregar declaraciones de espacio de nombres

Windows.UI.Notifications incluye las API del sistema.

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

Paso 2: Solicitar un URI de canal

En este ejemplo se solicita un URI de canal. La solicitud se realiza a la Plataforma de cliente de notificaciones, que a su vez solicita el URI del canal desde WNS. Una vez completada la solicitud, el valor devuelto es un objeto PushNotificationChannel que contiene el URI.

PushNotificationChannel channel = null;

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

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

Paso 3: Enviar el URI del canal al servidor

El URI del canal se empaqueta en una solicitud HTTP POST y se envía al servidor.

Importante

Debe enviar esta información al servidor de forma segura. Debe requerir que la aplicación se autentique con el servidor cuando transmita el URI del canal. Cifre la información y use un protocolo seguro, como 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.
}

Comentarios

Solicitar canales

Debe solicitar un nuevo canal cada vez que se invoque la aplicación mediante la siguiente lógica:

  1. Solicite un canal.
  2. Compare el nuevo canal con el canal anterior. Si el canal es el mismo, no es necesario realizar ninguna otra acción. Tenga en cuenta que esto requiere que la aplicación almacene el canal localmente cada vez que la aplicación lo envíe correctamente al servicio, de modo que tenga el canal para compararlo más adelante.
  3. Si el canal ha cambiado, envíe el nuevo canal al servicio web. Incluya la lógica de control de errores que siempre envía un nuevo canal en los casos siguientes:
    • La aplicación nunca ha enviado un canal al servicio web antes.
    • El último intento de la aplicación para enviar el canal al servicio web no se realizó correctamente.

Las diferentes llamadas al método CreatePushNotificationChannelForApplicationAsync no siempre devuelven un canal diferente. Si el canal no ha cambiado desde la última llamada, la aplicación debe conservar el esfuerzo y el tráfico de Internet al no volver a enviar ese mismo canal al servicio. Una aplicación puede tener varios URI de canal válidos al mismo tiempo. Dado que cada canal único permanece válido hasta que expira, no hay ningún daño en la solicitud de un nuevo canal porque no afecta a la hora de expiración de ningún canal anterior.

Al solicitar un nuevo canal cada vez que se invoca la aplicación, maximiza las posibilidades de tener siempre acceso a un canal válido. Esto es especialmente importante si es fundamental para el escenario de icono o notificación del sistema que el contenido siempre esté activo. Si te preocupa que un usuario no ejecute la aplicación más de una vez cada 30 días, puedes implementar una tarea en segundo plano para ejecutar el código de solicitud del canal de forma periódica.

Control de errores en las solicitudes de canal

La llamada al método CreatePushNotificationChannelForApplicationAsync puede producir un error si Internet no está disponible. Para controlar esto, agregue lógica de reintento al código que se muestra en el paso 2. Se recomiendan tres intentos con un retraso de 10 segundos entre cada intento incorrecto. Si se produce un error en los tres intentos, la aplicación debe esperar hasta la próxima vez que el usuario la inicie para volver a intentarlo.

Canales de cierre

La aplicación puede detener inmediatamente la entrega de notificaciones en todos los canales llamando al método PushNotificationChannel.Close . Aunque no será habitual que la aplicación lo haga, es posible que haya ciertos escenarios en los que quiera detener toda la entrega de notificaciones a la aplicación. Por ejemplo, si la aplicación tiene el concepto de cuentas de usuario y un usuario cierra sesión en esa aplicación, es razonable esperar que el icono ya no muestre la información personal del usuario. Para borrar correctamente el icono del contenido y detener la entrega de notificaciones, debe hacer lo siguiente:

  1. Detenga todas las actualizaciones de iconos llamando al método PushNotificationChannel.Close en cualquiera de los canales de notificación que entregan notificaciones de icono, notificación del sistema, notificación o notificaciones sin procesar a un usuario. Llamar al método Close garantiza que no se puedan entregar más notificaciones para ese usuario al cliente.
  2. Borre el contenido del icono llamando al método TileUpdater.Clear para quitar los datos del usuario anterior del icono.