Compartilhar via


Como solicitar, criar e salvar um canal de notificação

Você pode abrir um URI (Uniform Resource Identifier) de canal pelo qual seu aplicativo pode receber notificações por push. Você pode então enviar o canal para o seu servidor, que o usa para enviar notificações push e fechá-lo quando não precisar mais dele. Um canal é um endereço exclusivo que representa um único usuário em um único dispositivo, para um aplicativo específico ou bloco secundário.

Você deve solicitar um novo canal sempre que seu aplicativo for iniciado e atualizar o servidor de nuvem quando o URI for alterado. Para obter mais detalhes, confira Comentários.

Importante

Os canais de notificação expiram automaticamente após 30 dias.

O que você precisa saber

Tecnologias

  • Windows Runtime

Pré-requisitos

  • Familiaridade com os conceitos, os requisitos e a operação de notificação por push e WNS (Serviços de Notificação por Push do Windows). Eles são discutidos na visão geral do WNS (Serviços de Notificação por Push do Windows).

Instruções

Etapa 1: adicionar declarações de namespace

Windows.UI.Notifications inclui as APIs do sistema.

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

Etapa 2: Solicitar um URI de canal

Este exemplo solicita um URI de canal. A solicitação é feita para a Plataforma de Cliente de Notificação, que, por sua vez, solicita o URI do canal do WNS. Quando a solicitação é concluída, o valor retornado é um objeto PushNotificationChannel que contém o URI.

PushNotificationChannel channel = null;

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

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

Etapa 3: enviar o URI do canal para o servidor

O URI do canal é empacotado em uma solicitação HTTP POST e enviado ao servidor.

Importante

Você deve enviar essas informações para o seu servidor de maneira segura. Você deve exigir que o aplicativo se autentique com o servidor quando transmitir o URI do canal. Criptografe as informações e use um 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.
}

Comentários

Canais de solicitação

Você deve solicitar um novo canal sempre que seu aplicativo for invocado, usando a seguinte lógica:

  1. Solicite um canal.
  2. Compare o novo canal com o canal anterior. Se o canal for o mesmo, você não precisará realizar mais nenhuma ação. Observe que isso exige que seu aplicativo armazene o canal localmente sempre que o enviar com êxito para seu serviço, para que você tenha o canal para comparar mais tarde.
  3. Se o canal tiver sido alterado, envie o novo canal para o serviço Web. Inclua a lógica de tratamento de erros que sempre envia um novo canal nos seguintes casos:
    • Seu aplicativo nunca enviou um canal para o serviço Web antes.
    • A última tentativa do aplicativo de enviar o canal para o serviço Web não foi bem-sucedida.

Chamadas diferentes para o método CreatePushNotificationChannelForApplicationAsync nem sempre retornam um canal diferente. Se o canal não tiver sido alterado desde a última chamada, seu aplicativo deverá conservar o esforço e o tráfego da Internet não reenviando esse mesmo canal para seu serviço. Um aplicativo pode ter vários URIs de canal válidos ao mesmo tempo. Como cada canal exclusivo permanece válido até expirar, não há mal nenhum em solicitar um novo canal, pois isso não afeta o tempo de expiração de nenhum canal anterior.

Ao solicitar um novo canal sempre que seu aplicativo é invocado, você maximiza suas chances de sempre ter acesso a um canal válido. Isso é particularmente importante se for vital para seu cenário de bloco ou notificação do sistema que o conteúdo esteja sempre ativo. Se você estiver preocupado com o fato de um usuário não executar seu aplicativo mais de uma vez a cada 30 dias, poderá implementar uma tarefa em segundo plano para executar o código de solicitação de canal regularmente.

Tratamento de erros em solicitações de canal

A chamada para o método CreatePushNotificationChannelForApplicationAsync poderá falhar se a Internet não estiver disponível. Para lidar com isso, adicione a lógica de repetição ao código mostrado na etapa 2. Recomendamos três tentativas com um atraso de 10 segundos entre cada tentativa malsucedida. Se todas as três tentativas falharem, seu aplicativo deverá aguardar até a próxima vez que o usuário o iniciar para tentar novamente.

Fechando canais

Seu aplicativo pode interromper imediatamente a entrega de notificações em todos os canais chamando o método PushNotificationChannel.Close . Embora não seja comum que seu aplicativo faça isso, pode haver determinados cenários em que você deseja interromper toda a entrega de notificações para seu aplicativo. Por exemplo, se seu aplicativo tiver o conceito de contas de usuário e um usuário fizer logout desse aplicativo, é razoável esperar que o bloco não mostre mais as informações pessoais desse usuário. Para limpar com êxito o bloco de conteúdo e interromper a entrega de notificações, você deve fazer o seguinte:

  1. Pare todas as atualizações de bloco chamando o método PushNotificationChannel.Close em qualquer um dos canais de notificação que estão entregando notificações de bloco, notificação do sistema, notificação ou notificações brutas a um usuário. Chamar o método Close garante que nenhuma notificação adicional para esse usuário possa ser entregue ao cliente.
  2. Limpe o conteúdo do bloco chamando o método TileUpdater.Clear para remover os dados do usuário anterior do bloco.