Tutorial: Enviar notificações para dispositivos específicos que executam aplicativos da Plataforma Universal do Windows
Observação
O Serviço de Notificação por Push da Microsoft (MPNS) foi preterido e não é mais suportado.
Visão geral
Este tutorial mostra como usar os Hubs de Notificação do Azure para transmitir notificações de últimas notícias. Este tutorial abrange aplicativos da Windows Store ou do Windows Phone 8.1 (não Silverlight). Se você estiver visando o Windows Phone 8.1 Silverlight, consulte Notificações por push para dispositivos Windows Phone específicos usando os Hubs de Notificação do Azure.
Neste tutorial, você aprenderá a usar os Hubs de Notificação do Azure para enviar notificações por push para dispositivos Windows específicos que executam um aplicativo da Plataforma Universal do Windows (UWP). Depois de concluir o tutorial, você pode se registrar para as categorias de últimas notícias em que está interessado. Você receberá notificações por push apenas para essas categorias.
Para habilitar cenários de transmissão, inclua uma ou mais tags ao criar um registro no hub de notificação. Quando as notificações são enviadas para uma etiqueta, todos os dispositivos registados para a etiqueta recebem a notificação. Para obter mais informações sobre tags, consulte Roteamento e expressões de tag.
Observação
As versões de projeto da Windows Store e do Windows Phone 8.1 e anteriores não são suportadas no Visual Studio 2019. Para obter mais informações, consulte Visual Studio 2019 Platform Targeting and Compatibility.
Neste tutorial, você executa as seguintes tarefas:
- Adicionar seleção de categoria ao aplicativo móvel
- Registe-se para receber notificações
- Enviar notificações marcadas
- Execute o aplicativo e gere notificações
Pré-requisitos
Conclua o Tutorial: Enviar notificações para aplicativos da Plataforma Universal do Windows usando os Hubs de Notificação do Azure antes de iniciar este tutorial.
Adicionar seleção de categoria ao aplicativo
A primeira etapa é adicionar elementos da interface do usuário à sua página principal existente para que os usuários possam selecionar categorias para registrar. As categorias selecionadas são armazenadas no dispositivo. Quando o aplicativo é iniciado, ele cria um registro de dispositivo em seu hub de notificação, com as categorias selecionadas como tags.
Abra o arquivo de projeto MainPage.xaml e copie o
Grid
seguinte código no 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>
No Gerenciador de Soluções, clique com o botão direito do mouse no projeto, selecione Adicionar>Classe. Em Adicionar Novo Item, nomeie a classe Notificações e selecione Adicionar. Se necessário, adicione o
public
modificador à definição de classe.Adicione as seguintes
using
instruções ao novo arquivo:using Windows.Networking.PushNotifications; using Microsoft.WindowsAzure.Messaging; using Windows.Storage; using System.Threading.Tasks;
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); }
Essa classe usa o armazenamento local para armazenar as categorias de notícias que esse dispositivo deve receber. Em vez de chamar o
RegisterNativeAsync
método, chameRegisterTemplateAsync
para se registar para as categorias usando um registo de modelo.Se você quiser registrar mais de um modelo, forneça um nome de modelo, por exemplo, simpleWNSTemplateExample. Você nomeia os modelos para que possa atualizá-los ou excluí-los. Você pode registrar mais de um modelo para ter um para notificações de 'toast' e outro para azulejos.
Observação
Com os Hubs de Notificação, um dispositivo pode registrar vários modelos usando a mesma tag. Nesse caso, uma mensagem de entrada direcionada à tag resulta em várias notificações sendo entregues ao dispositivo, uma para cada modelo. Esse processo permite exibir a mesma mensagem em várias notificações visuais, como tanto um emblema quanto uma notificação de alerta numa aplicação da Loja Windows.
Para obter mais informações, consulte Modelos.
No arquivo de projeto App.xaml.cs , adicione a seguinte propriedade à
App
classe:public Notifications notifications = new Notifications("<hub name>", "<connection string with listen access>");
Você usa essa propriedade para criar e acessar uma
Notifications
instância.No código, substitua os espaços reservados
<hub name>
e<connection string with listen access>
pelo nome do hub de notificação e pela cadeia de conexão para DefaultListenSharedAccessSignature, que obteve anteriormente.Observação
Como as credenciais distribuídas com um aplicativo cliente geralmente não são seguras, distribua apenas a chave para acesso de escuta com seu aplicativo cliente. Com o acesso de escuta, seu aplicativo pode se registrar para notificações, mas os registros existentes não podem ser modificados e as notificações não podem ser enviadas. A chave de acesso total é usada em um serviço de back-end seguro para enviar notificações e alterar registros existentes.
No arquivo MainPage.xaml.cs , adicione a seguinte linha:
using Windows.UI.Popups;
No arquivo 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(); }
Esse método cria uma lista de categorias e usa a
Notifications
classe para armazenar a lista no armazenamento local. Ele também registra as tags correspondentes no seu hub de notificação. Quando as categorias mudam, o registo é recriado com as novas categorias.
Agora, seu aplicativo pode armazenar um conjunto de categorias no armazenamento local no dispositivo. O aplicativo se registra no hub de notificação sempre que os usuários alteram a seleção de categoria.
Registe-se para receber notificações
Nesta seção, você se registra no hub de notificação na inicialização usando as categorias armazenadas no armazenamento local.
Observação
Como o URI do canal atribuído pelo Serviço de Notificação do Windows (WNS) pode ser alterado a qualquer momento, você deve se registrar para receber notificações com frequência para evitar falhas de notificação. Este exemplo registra-se para notificação sempre que o aplicativo é iniciado. Para aplicativos que você executa com frequência, digamos, mais de uma vez por dia, você provavelmente pode ignorar o registro para preservar a largura de banda se menos de um dia tiver passado desde o registro anterior.
Para usar a
notifications
classe para se inscrever com base em categorias, abra o arquivo App.xaml.cs e atualize oInitNotificationsAsync
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();
Esse processo garante que, quando o aplicativo for iniciado, ele recupere as categorias do armazenamento local. Em seguida, solicita o registo destas categorias. Você criou o
InitNotificationsAsync
método como parte do tutorial Enviar notificações para aplicativos da Plataforma Universal do Windows usando os Hubs de Notificação do Azure .No arquivo 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 status de categorias salvas anteriormente.
O aplicativo agora está completo. Ele pode armazenar um conjunto de categorias no armazenamento local do dispositivo. Quando os usuários alteram a seleção de categoria, as categorias salvas são usadas para se registrar no hub de notificação. Na próxima seção, você define um back-end que pode enviar notificações de categoria para este aplicativo.
Executar o aplicativo UWP
No Visual Studio, selecione F5 para compilar e iniciar o aplicativo. A interface do usuário do aplicativo fornece um conjunto de alternâncias que permite que você escolha as categorias para se inscrever.
Ative uma ou mais opções de categoria e selecione Assinar.
O aplicativo converte as categorias selecionadas em tags e solicita um novo registro de dispositivo para as tags selecionadas no hub de notificação. O aplicativo exibe as categorias registradas em uma caixa de diálogo.
Criar um aplicativo de console para enviar notificações marcadas
Nesta seção, você envia as últimas notícias como notificações de modelo marcadas de um aplicativo de console .NET.
No Visual Studio, crie um novo aplicativo de console do Visual C#:
- No menu, selecione Arquivo>Novo>Projeto.
- Em Criar um novo projeto, selecione Aplicativo de Console (.NET Framework) para C# na lista de modelos e selecione Avançar.
- Introduzir um nome para a aplicação.
- Em Solução, escolha Adicionar à solução e selecione Criar para criar o projeto.
Selecione Tools>NuGet Package Manager> Console e, na janela do console, 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 usando o pacote Microsoft.Azure.NotificationHubs .
Abra o arquivo Program.cs e adicione a seguinte
using
instrução:using Microsoft.Azure.NotificationHubs;
Program
Na classe, 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); } }
Esse código envia uma notificação de modelo para cada uma das seis tags na matriz de cadeia de caracteres. O uso de tags garante que os dispositivos recebam notificações apenas para as categorias registradas.
No código anterior, substitua os espaços reservados
<hub name>
e<connection string with full access>
pelo nome do seu hub de notificação e pela cadeia de conexão DefaultFullSharedAccessSignature do painel do seu hub de notificação.Main()
No método, adicione as seguintes linhas:SendTemplateNotificationAsync(); Console.ReadLine();
Crie o aplicativo de console.
Execute o aplicativo de console para enviar notificações marcadas
Execute o aplicativo criado na seção anterior. As notificações para as categorias selecionadas aparecem como notificações flutuantes.
Próximos passos
Neste artigo, você aprendeu como transmitir notícias de última hora por categoria. O aplicativo back-end envia notificações marcadas para dispositivos que se registraram para receber notificações para essa tag. Para saber como enviar notificações por push para usuários específicos, independentemente do dispositivo que eles usam, avance para o seguinte tutorial: