Tutorial: Enviar notificações para dispositivos específicos em execução Plataforma Universal do Windows aplicações

Nota

O Serviço de Notificação Push da Microsoft (MPNS) foi preterido e já não é suportado.

Descrição Geral

Este tutorial mostra-lhe como utilizar os Hubs de Notificação do Azure para transmitir notificações de notícias de última hora. Este tutorial abrange a Loja Windows ou Windows Phone aplicações 8.1 (não Silverlight). Se estiver a direcionar Windows Phone Silverlight 8.1, veja Enviar notificações push para dispositivos Windows Phone específicos com os Hubs de Notificação do Azure.

Neste tutorial, irá aprender a utilizar os Hubs de Notificação do Azure para enviar notificações push para dispositivos Windows específicos com uma aplicação Plataforma Universal do Windows (UWP). Depois de concluir o tutorial, pode registar-se nas categorias de notícias de última hora nas quais está interessado. Receberá notificações push apenas para essas categorias.

Para ativar cenários de difusão, inclua uma ou mais etiquetas quando criar um registo no hub de notificação. Quando as notificações são enviadas para uma etiqueta, todos os dispositivos que estão registados na etiqueta recebem a notificação. Para obter mais informações sobre etiquetas, veja Expressões de encaminhamento e etiquetas.

Nota

A Loja Windows e Windows Phone versões 8.1 e anteriores do projeto não são suportadas no Visual Studio 2019. Para obter mais informações, veja Visual Studio 2019 Platform Targeting and Compatibility (Segmentação e Compatibilidade de Plataformas do Visual Studio 2019).

Neste tutorial, vai realizar as seguintes tarefas:

  • Adicionar a seleção de categorias à aplicação móvel
  • Registar-se para receber notificações
  • Enviar notificações marcadas
  • Executar a aplicação e gerar notificações

Pré-requisitos

Antes de iniciar este tutorial, conclua Tutorial: Enviar notificações para aplicações da Plataforma Universal do Windows com os Hubs de Notificação do Azure.

Adicionar a seleção de categorias à aplicação

O primeiro passo é adicionar os elementos da IU à sua página principal existente, de modo a que os utilizadores possam selecionar as categorias em que se vão registar. As categorias selecionadas são armazenadas nos dispositivos. Quando a aplicação é iniciada, cria um registo de dispositivos no seu hub de notificação, com as categorias selecionadas como etiquetas.

  1. Abra o ficheiro de projeto MainPage.xaml e, em seguida, copie o seguinte código no Grid elemento:

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"  TextWrapping="Wrap" Text="Breaking News" FontSize="42" VerticalAlignment="Top" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="World" Name="WorldToggle" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Politics" Name="PoliticsToggle" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Business" Name="BusinessToggle" Grid.Row="3" Grid.Column="0" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Technology" Name="TechnologyToggle" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Science" Name="ScienceToggle" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Sports" Name="SportsToggle" Grid.Row="3" Grid.Column="1" HorizontalAlignment="Center"/>
        <Button Name="SubscribeButton" Content="Subscribe" HorizontalAlignment="Center" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Click="SubscribeButton_Click"/>
    </Grid>
    
  2. Em Explorador de Soluções, clique com o botão direito do rato no projeto, selecione Adicionar>Classe. Em Adicionar Novo Item, atribua um nome à classe Notificações e selecione Adicionar. Se necessário, adicione o public modificador à definição de classe.

  3. Adicione as seguintes using instruções ao novo ficheiro:

    using Windows.Networking.PushNotifications;
    using Microsoft.WindowsAzure.Messaging;
    using Windows.Storage;
    using System.Threading.Tasks;
    
  4. Copie o seguinte código para a nova Notifications classe:

    private NotificationHub hub;
    
    public Notifications(string hubName, string listenConnectionString)
    {
        hub = new NotificationHub(hubName, listenConnectionString);
    }
    
    public async Task<Registration> StoreCategoriesAndSubscribe(IEnumerable<string> categories)
    {
        ApplicationData.Current.LocalSettings.Values["categories"] = string.Join(",", categories);
        return await SubscribeToCategories(categories);
    }
    
    public IEnumerable<string> RetrieveCategories()
    {
        var categories = (string) ApplicationData.Current.LocalSettings.Values["categories"];
        return categories != null ? categories.Split(','): new string[0];
    }
    
    public async Task<Registration> SubscribeToCategories(IEnumerable<string> categories = null)
    {
        var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    
        if (categories == null)
        {
            categories = RetrieveCategories();
        }
    
        // Using a template registration to support notifications across platforms.
        // Any template notifications that contain messageParam and a corresponding tag expression
        // will be delivered for this registration.
    
        const string templateBodyWNS = "<toast><visual><binding template=\"ToastText01\"><text id=\"1\">$(messageParam)</text></binding></visual></toast>";
    
        return await hub.RegisterTemplateAsync(channel.Uri, templateBodyWNS, "simpleWNSTemplateExample",
                categories);
    }
    

    Esta classe utiliza o armazenamento local para armazenar as categorias de notícias que este dispositivo tem de receber. Em vez de chamar o RegisterNativeAsync método, chame RegisterTemplateAsync para se registar nas categorias com um registo de modelo.

    Se quiser registar mais do que um modelo, forneça um nome de modelo, por exemplo, simpleWNSTemplateExample. Deve dar nomes aos modelos para poder atualizá-los ou eliminá-los. Pode registar mais do que um modelo para ter um para notificações de alerta e outro para mosaicos.

    Nota

    Com os Hubs de Notificação, um dispositivo pode registar vários modelos com a mesma etiqueta. Neste caso, uma mensagem recebida que visa a etiqueta resulta na entrega de várias notificações no dispositivo, uma para cada modelo. Este processo permite-lhe apresentar a mesma mensagem em várias notificações visuais, como um distintivo e uma notificação de alerta numa aplicação da Loja Windows.

    Para obter mais informações, veja Templates (Modelos).

  5. No ficheiro de projeto App.xaml.cs , adicione a seguinte propriedade à App classe:

    public Notifications notifications = new Notifications("<hub name>", "<connection string with listen access>");
    

    Utiliza esta propriedade para criar e aceder a uma Notifications instância.

    No código, substitua os marcadores de posição <hub name> e <connection string with listen access> pelo nome do seu hub de notificação e pela cadeia de ligação de DefaultListenSharedAccessSignature, que obteve anteriormente.

    Nota

    Uma vez que, de um modo geral, as credenciais que são distribuídas com uma aplicação cliente não são seguras, distribua a chave apenas para acesso de escuta com a sua aplicação cliente. Com o acesso de escuta, a sua aplicação pode registar-se para receber notificações, mas não é possível modificar registos existentes nem enviar notificações. A chave de acesso total é utilizada num serviço de back-end protegido para o envio de notificações e a alteração de registos existentes.

  6. No ficheiro MainPage.xaml.cs , adicione a seguinte linha:

    using Windows.UI.Popups;
    
  7. No ficheiro MainPage.xaml.cs , adicione o seguinte método:

    private async void SubscribeButton_Click(object sender, RoutedEventArgs e)
    {
        var categories = new HashSet<string>();
        if (WorldToggle.IsOn) categories.Add("World");
        if (PoliticsToggle.IsOn) categories.Add("Politics");
        if (BusinessToggle.IsOn) categories.Add("Business");
        if (TechnologyToggle.IsOn) categories.Add("Technology");
        if (ScienceToggle.IsOn) categories.Add("Science");
        if (SportsToggle.IsOn) categories.Add("Sports");
    
        var result = await ((App)Application.Current).notifications.StoreCategoriesAndSubscribe(categories);
    
        var dialog = new MessageDialog("Subscribed to: " + string.Join(",", categories) + " on registration Id: " + result.RegistrationId);
        dialog.Commands.Add(new UICommand("OK"));
        await dialog.ShowAsync();
    }
    

    Este método cria uma lista de categorias e utiliza a Notifications classe para armazenar a lista no armazenamento local. Também regista as etiquetas correspondentes no seu hub de notificação. Quando as categorias são alteradas, o registo é recriado com as novas categorias.

A aplicação pode agora armazenar um conjunto de categorias no armazenamento local do dispositivo. A aplicação regista-se no hub de notificação sempre que os utilizadores alteram a seleção de categorias.

Registar-se para receber notificações

Nesta secção, vai utilizar as categorias que foram armazenadas no armazenamento local para fazer o registo no hub de notificação no arranque.

Nota

Tendo em conta que o URI do canal que é atribuído pelo Windows Notification Service (WNS) pode ser alterado em qualquer altura, deve registar-se para receber notificações com frequência, a fim de evitar falhas de notificação. Este exemplo regista-se em notificações sempre que a aplicação é iniciada. Para aplicações que executa com frequência, por exemplo, mais do que uma vez por dia, provavelmente pode ignorar o registo para preservar a largura de banda se tiver passado menos de um dia desde o registo anterior.

  1. Para utilizar a notifications classe para subscrever com base em categorias, abra o ficheiro App.xaml.cs e, em seguida, atualize o InitNotificationsAsync método.

    // *** Remove or comment out these lines ***
    //var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    //var hub = new NotificationHub("your hub name", "your listen connection string");
    //var result = await hub.RegisterNativeAsync(channel.Uri);
    
    var result = await notifications.SubscribeToCategories();
    

    Este processo garante que, quando a aplicação é iniciada, obtém as categorias do armazenamento local. Em seguida, pede o registo destas categorias. Criou o InitNotificationsAsync método como parte do tutorial Enviar notificações para Plataforma Universal do Windows aplicações com os Hubs de Notificação do Azure.

  2. No ficheiro de projeto MainPage.xaml.cs , adicione o seguinte código ao OnNavigatedTo método:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        var categories = ((App)Application.Current).notifications.RetrieveCategories();
    
        if (categories.Contains("World")) WorldToggle.IsOn = true;
        if (categories.Contains("Politics")) PoliticsToggle.IsOn = true;
        if (categories.Contains("Business")) BusinessToggle.IsOn = true;
        if (categories.Contains("Technology")) TechnologyToggle.IsOn = true;
        if (categories.Contains("Science")) ScienceToggle.IsOn = true;
        if (categories.Contains("Sports")) SportsToggle.IsOn = true;
    }
    

    Este código atualiza a página principal com base no estado das categorias guardadas anteriormente.

A aplicação está agora concluída e Pode armazenar um conjunto de categorias no armazenamento local do dispositivo. Quando os utilizadores alteram a seleção da categoria, as categorias guardadas são utilizadas para se registarem no hub de notificação. Na próxima secção, vai definir um back-end apto a enviar notificações de categorias para esta aplicação.

Executar a aplicação UWP

  1. No Visual Studio, selecione F5 para compilar e iniciar a aplicação. A IU da aplicação fornece um conjunto de botões de alternar que lhe permite selecionar as categorias que pretende subscrever.

    Aplicação de Notícias de Última Hora

  2. Ative um ou mais seletores de categoria e, em seguida, selecione Subscrever.

    A aplicação converte as categorias selecionadas em etiquetas e pede um novo registo do dispositivo para as etiquetas selecionadas ao hub de notificação. A aplicação apresenta as categorias registadas numa caixa de diálogo.

    Seletores de categorias e botão Subscribe

Criar uma aplicação de consola para enviar notificações com etiquetas

Nesta secção, irá enviar notícias de última hora como notificações de modelo etiquetadas a partir da aplicação de consola .NET.

  1. No Visual Studio, crie uma nova aplicação da consola Visual C#

    1. No menu, selecione Ficheiro>Novo>Projeto.
    2. Em Criar um novo projeto, selecione Aplicação de Consola (.NET Framework) para C# na lista de modelos e selecione Seguinte.
    3. Introduza um nome para a aplicação.
    4. Em Solução, selecione Adicionar à solução e selecione Criar para criar o projeto.
  2. Selecione Ferramentas>NuGet Gestor de>Pacotes Consola do Gestor de Pacotes e, em seguida, na janela da consola, execute o seguinte comando:

    Install-Package Microsoft.Azure.NotificationHubs
    

    Esta ação adiciona uma referência ao SDK dos Hubs de Notificação do Azure com o pacote Microsoft.Azure.NotificationHubs .

  3. Abra o ficheiro Program.cs e adicione a seguinte using instrução:

    using Microsoft.Azure.NotificationHubs;
    
  4. Na classe Program, adicione o seguinte método ou substitua-o se já existir:

    private static async void SendTemplateNotificationAsync()
    {
        // Define the notification hub.
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("<connection string with full access>", "<hub name>");
    
        // Apple requires the apns-push-type header for all requests
        var headers = new Dictionary<string, string> {{"apns-push-type", "alert"}};
    
        // Create an array of breaking news categories.
        var categories = new string[] { "World", "Politics", "Business", "Technology", "Science", "Sports"};
    
        // Send the notification as a template notification. All template registrations that contain
        // "messageParam" and the proper tags will receive the notifications.
        // This includes APNS, GCM/FCM, WNS, and MPNS template registrations.
    
        Dictionary<string, string> templateParams = new Dictionary<string, string>();
    
        foreach (var category in categories)
        {
            templateParams["messageParam"] = "Breaking " + category + " News!";
            await hub.SendTemplateNotificationAsync(templateParams, category);
        }
    }
    

    Este código envia uma notificação de modelo para cada uma das seis etiquetas na matriz de cadeias. A utilização de etiquetas assegura que os dispositivos recebem notificações apenas para as categorias registadas.

  5. No código anterior, substitua os marcadores de posição <hub name> e <connection string with full access> pelo nome do seu hub de notificação e pela cadeia de ligação para DefaultFullSharedAccessSignature do dashboard do seu hub de notificação.

  6. Main() No método, adicione as seguintes linhas:

     SendTemplateNotificationAsync();
     Console.ReadLine();
    
  7. Crie a aplicação de consola.

Executar a aplicação de consola para enviar notificações com etiquetas

Execute a aplicação criada na secção anterior. As notificações das categorias selecionadas são apresentadas como notificações de alerta.

Passos seguintes

Neste artigo, aprendeu a difundir notícias de última hora por categoria. A aplicação de back-end envia notificações etiquetadas para dispositivos que se registaram para receber notificações dessa etiqueta. Para saber como enviar notificações push para utilizadores específicos independentemente do dispositivo que utilizam, avance para o seguinte tutorial: