Tutorial: Notificações push para dispositivos Windows Phone específicos ao utilizar os Hubs de notificação do AzureTutorial: Push notifications to specific Windows Phone devices by using Azure Notification Hubs

Este tutorial mostra-lhe como utilizar os Hubs de Notificação do Azure para enviar notificações push para dispositivos Windows Phone 8 ou Windows Phone 8.1 específicos.This tutorial shows you how to use Azure Notification Hubs to send push notifications to specific Windows Phone 8 or Windows Phone 8.1 devices. Se o seu foco incide sobre o Windows Phone 8.1 (não Silverlight), consulte a versão Universal para Windows deste tutorial.If you are targeting Windows Phone 8.1 (non-Silverlight), see the Windows Universal version of this tutorial.

Para possibilitar este cenário, inclua uma ou mais etiquetas quando criar um registo no hub de notificação.You enable this scenario by including one or more tags when creating a registration in the notification hub. Quando as notificações são enviadas para uma etiqueta, todos os dispositivos registados para a etiqueta receberão a notificação.When notifications are sent to a tag, all devices that have registered for the tag receive the notification. Para obter mais informações sobre etiquetas, consulte Etiquetas nos registos.For more information about tags, see Tags in registrations.

Nota

O SDK dos Notification Hubs do Windows Phone não suporta a utilização do Serviço de Notificações Push do Windows (WNS) com aplicações do Windows Phone 8.1 Silverlight.The Notification Hubs Windows Phone SDK does not support using the Windows Push Notification Service (WNS) with Windows Phone 8.1 Silverlight apps. Para utilizar o WNS (em vez do MPNS) com aplicações para Windows Phone 8.1 Silverlight, siga o [tutorial Hubs de Notificação – Windows Phone Silverlight], que utiliza APIs REST.To use WNS (instead of MPNS) with Windows Phone 8.1 Silverlight apps, follow the [Notification Hubs - Windows Phone Silverlight tutorial], which uses REST APIs.

Neste tutorial, ficará a saber como:In this tutorial, you learn how to:

  • Adicionar a seleção de categorias à aplicação móvelAdd category selection to the mobile app
  • Registar-se para receber notificações com etiquetasRegister for notifications with tags
  • Enviar notificações com etiquetasSend tagged notifications
  • Testar a aplicaçãoTest the app

Pré-requisitosPrerequisites

Concluir o Tutorial: Notificações push para aplicações Windows Phone ao utilizar os Hubs de notificação do Azure.Complete the Tutorial: Push notifications to Windows Phone apps by using Azure Notification Hubs. Neste tutorial, irá atualizar a aplicação móvel de modo a poder registar-se para receber categorias de notícias de última hora do seu interesse e receber apenas notificações push relativas a essas categorias.In this tutorial, you update the mobile application so that you can register for breaking news categories you are interested in, and receive only push notifications for those categories.

Adicionar a seleção de categorias à aplicação móvelAdd category selection to the mobile app

O primeiro passo consiste em adicionar os elementos de IU à sua página principal existente que permitem ao utilizador selecionar as categorias a registar.The first step is to add the UI elements to your existing main page that enable the user to select categories to register. As categorias selecionadas por um utilizador são armazenadas no dispositivo.The categories selected by a user are stored on the device. Quando a aplicação é iniciada, é criado o registo do dispositivo no seu Hub de Notificação com as categorias selecionadas como etiquetas.When the app starts, a device registration is created in your notification hub with the selected categories as tags.

  1. Abra o MainPage.xaml de ficheiros, em seguida, substitua o Grid elementos com o nome TitlePanel e ContentPanel com o código a seguir:Open the MainPage.xaml file, then replace the Grid elements named TitlePanel and ContentPanel with the following code:

    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock Text="Breaking News" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
        <TextBlock Text="Categories" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>
    
    <Grid Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <CheckBox Name="WorldCheckBox" Grid.Row="0" Grid.Column="0">World</CheckBox>
        <CheckBox Name="PoliticsCheckBox" Grid.Row="1" Grid.Column="0">Politics</CheckBox>
        <CheckBox Name="BusinessCheckBox" Grid.Row="2" Grid.Column="0">Business</CheckBox>
        <CheckBox Name="TechnologyCheckBox" Grid.Row="0" Grid.Column="1">Technology</CheckBox>
        <CheckBox Name="ScienceCheckBox" Grid.Row="1" Grid.Column="1">Science</CheckBox>
        <CheckBox Name="SportsCheckBox" Grid.Row="2" Grid.Column="1">Sports</CheckBox>
        <Button Name="SubscribeButton" Content="Subscribe" HorizontalAlignment="Center" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Click="SubscribeButton_Click" />
    </Grid>
    
  2. Adicionar uma classe chamada Notifications ao projeto.Add a class named Notifications to the project. Adicionar o public modificador à definição de classe.Add the public modifier to the class definition. Em seguida, adicione o seguinte using instruções para o novo ficheiro:Then, add the following using statements to the new file:

    using Microsoft.Phone.Notification;
    using Microsoft.WindowsAzure.Messaging;
    using System.IO.IsolatedStorage;
    using System.Windows;
    
  3. Copie o seguinte código para o novo Notifications classe:Copy the following code into the new Notifications class:

    private NotificationHub hub;
    
    // Registration task to complete registration in the ChannelUriUpdated event handler
    private TaskCompletionSource<Registration> registrationTask;
    
    public Notifications(string hubName, string listenConnectionString)
    {
        hub = new NotificationHub(hubName, listenConnectionString);
    }
    
    public IEnumerable<string> RetrieveCategories()
    {
        var categories = (string)IsolatedStorageSettings.ApplicationSettings["categories"];
        return categories != null ? categories.Split(',') : new string[0];
    }
    
    public async Task<Registration> StoreCategoriesAndSubscribe(IEnumerable<string> categories)
    {
        var categoriesAsString = string.Join(",", categories);
        var settings = IsolatedStorageSettings.ApplicationSettings;
        if (!settings.Contains("categories"))
        {
            settings.Add("categories", categoriesAsString);
        }
        else
        {
            settings["categories"] = categoriesAsString;
        }
        settings.Save();
    
        return await SubscribeToCategories();
    }
    
    public async Task<Registration> SubscribeToCategories()
    {
        registrationTask = new TaskCompletionSource<Registration>();
    
        var channel = HttpNotificationChannel.Find("MyPushChannel");
    
        if (channel == null)
        {
            channel = new HttpNotificationChannel("MyPushChannel");
            channel.Open();
            channel.BindToShellToast();
            channel.ChannelUriUpdated += channel_ChannelUriUpdated;
    
            // This is optional, used to receive notifications while the app is running.
            channel.ShellToastNotificationReceived += channel_ShellToastNotificationReceived;
        }
    
        // If channel.ChannelUri is not null, complete the registrationTask here.  
        // If it is null, the registrationTask will be completed in the ChannelUriUpdated event handler.
        if (channel.ChannelUri != null)
        {
            await RegisterTemplate(channel.ChannelUri);
        }
    
        return await registrationTask.Task;
    }
    
    async void channel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
    {
        await RegisterTemplate(e.ChannelUri);
    }
    
    async Task<Registration> RegisterTemplate(Uri channelUri)
    {
        // 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 templateBodyMPNS = "<wp:Notification xmlns:wp=\"WPNotification\">" +
                                            "<wp:Toast>" +
                                                "<wp:Text1>$(messageParam)</wp:Text1>" +
                                            "</wp:Toast>" +
                                        "</wp:Notification>";
    
        // The stored categories tags are passed with the template registration.
    
        registrationTask.SetResult(await hub.RegisterTemplateAsync(channelUri.ToString(),
            templateBodyMPNS, "simpleMPNSTemplateExample", this.RetrieveCategories()));
    
        return await registrationTask.Task;
    }
    
    // This is optional. It is used to receive notifications while the app is running.
    void channel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
    {
        StringBuilder message = new StringBuilder();
        string relativeUri = string.Empty;
    
        message.AppendFormat("Received Toast {0}:\n", DateTime.Now.ToShortTimeString());
    
        // Parse out the information that was part of the message.
        foreach (string key in e.Collection.Keys)
        {
            message.AppendFormat("{0}: {1}\n", key, e.Collection[key]);
    
            if (string.Compare(
                key,
                "wp:Param",
                System.Globalization.CultureInfo.InvariantCulture,
                System.Globalization.CompareOptions.IgnoreCase) == 0)
            {
                relativeUri = e.Collection[key];
            }
        }
    
        // Display a dialog of all the fields in the toast.
        System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            MessageBox.Show(message.ToString());
        });
    }
    

    Esta classe utiliza o armazenamento isolado para armazenar as categorias de notícias que este dispositivo irá receber.This class uses the isolated storage to store the categories of news that this device is to receive. Também contém métodos com vista a registar-se para receber estas categorias através de um registo de notificação modelo.It also contains methods to register for these categories using a template notification registration.

  4. Na App.xaml.cs ficheiros do projeto, adicione a seguinte propriedade para o App classe.In the App.xaml.cs project file, add the following property to the App class. 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.Replace the <hub name> and <connection string with listen access> placeholders with your notification hub name and the connection string for DefaultListenSharedAccessSignature that you obtained earlier.

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

    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, só deve distribuir a chave para acesso de escuta com a sua aplicação cliente.Because credentials that are distributed with a client app are not generally secure, you should only distribute the key for listen access with your client app. O acesso de escuta permite que a sua aplicação seja registada para receber notificações, mas não é possível modificar os registos existentes nem enviar notificações.Listen access enables your app to register for notifications, but existing registrations cannot be modified and notifications cannot be sent. A chave de acesso total é utilizada num serviço back-end protegido para enviar notificações e alterar registos existentes.The full access key is used in a secured backend service for sending notifications and changing existing registrations.

  5. Na MainPage.xaml.cs, adicione a seguinte linha:In the MainPage.xaml.cs, add the following line:

    using Windows.UI.Popups;
    
  6. No ficheiro de projeto MainPage.xaml.cs, adicione o seguinte método:In the MainPage.xaml.cs project file, add the following method:

    private async void SubscribeButton_Click(object sender, RoutedEventArgs e)
    {
        var categories = new HashSet<string>();
        if (WorldCheckBox.IsChecked == true) categories.Add("World");
        if (PoliticsCheckBox.IsChecked == true) categories.Add("Politics");
        if (BusinessCheckBox.IsChecked == true) categories.Add("Business");
        if (TechnologyCheckBox.IsChecked == true) categories.Add("Technology");
        if (ScienceCheckBox.IsChecked == true) categories.Add("Science");
        if (SportsCheckBox.IsChecked == true) categories.Add("Sports");
    
        var result = await ((App)Application.Current).notifications.StoreCategoriesAndSubscribe(categories);
    
        MessageBox.Show("Subscribed to: " + string.Join(",", categories) + " on registration id : " +
            result.RegistrationId);
    }
    

    Este método cria uma lista de categorias e utiliza o Notifications etiquetas de classe para armazenar a lista no armazenamento local e registe-se de que o correspondente com o seu hub de notificação.This method creates a list of categories and uses the Notifications class to store the list in the local storage and register the corresponding tags with your notification hub. Quando as categorias são alteradas, o registo é recriado com as novas categorias.When categories are changed, the registration is recreated with the new categories.

A sua aplicação pode agora armazenar um conjunto de categorias no armazenamento local do dispositivo e ficar registada no Hub de Notificação sempre que o utilizador alterar a seleção das categorias.Your app is now able to store a set of categories in local storage on the device and register with the notification hub whenever the user changes the selection of categories.

Registar-se para receber notificaçõesRegister for notifications

Estes passos efetuam o registo através do hub de notificação no arranque mediante a utilização das categorias que foram armazenadas no armazenamento local.These steps register with the notification hub on startup using the categories that have been stored in local storage.

Nota

Tendo em conta que o URI do canal atribuído pelo Serviço de Notificações Push da Microsoft (MPNS) pode ser alterado em qualquer altura, deve registar-se para receber notificações com frequência a fim de evitar falhas de notificação.Because the channel URI assigned by the Microsoft Push Notification Service (MPNS) can change at any time, you should register for notifications frequently to avoid notification failures. Este exemplo efetua o registo para receber notificações sempre que a aplicação é iniciada.This example registers for notifications every time that the app starts. Relativamente às aplicações executadas com frequência, ou seja, mais do que uma vez por dia, pode provavelmente ignorar o registo para poupar a largura de banda, caso tenha passado menos de um dia desde o registo anterior.For apps that are run frequently, more than once a day, you can probably skip registration to preserve bandwidth if less than a day has passed since the previous registration.

  1. Abra o ficheiro App.xaml.cs e adicione a async modificador para Application_Launching método e substitua o registo dos Notification Hubs código que adicionou no introdução aos Hubs de notificação com o código a seguir:Open the App.xaml.cs file and add the async modifier to Application_Launching method and replace the Notification Hubs registration code that you added in Get started with Notification Hubs with the following code:

    private async void Application_Launching(object sender, LaunchingEventArgs e)
    {
        var result = await notifications.SubscribeToCategories();
    
        if (result != null)
            System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                MessageBox.Show("Registration Id :" + result.RegistrationId, "Registered", MessageBoxButton.OK);
            });
    }
    

    Este código garante que, sempre que a aplicação é iniciada, as categorias são obtidas a partir do armazenamento local e é pedido o registo destas categorias.This code makes sure that every time the app starts it retrieves the categories from local storage and requests a registration for these categories.

  2. No arquivo de projeto MainPage.xaml.cs, adicione o seguinte código que implementa o OnNavigatedTo método:In the MainPage.xaml.cs project file, add the following code that implements the OnNavigatedTo method:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        var categories = ((App)Application.Current).notifications.RetrieveCategories();
    
        if (categories.Contains("World")) WorldCheckBox.IsChecked = true;
        if (categories.Contains("Politics")) PoliticsCheckBox.IsChecked = true;
        if (categories.Contains("Business")) BusinessCheckBox.IsChecked = true;
        if (categories.Contains("Technology")) TechnologyCheckBox.IsChecked = true;
        if (categories.Contains("Science")) ScienceCheckBox.IsChecked = true;
        if (categories.Contains("Sports")) SportsCheckBox.IsChecked = true;
    }
    

    Este código atualiza a página principal com base no estado das categorias guardadas anteriormente.This code updates the main page based on the status of previously saved categories.

A aplicação está agora completa, sendo capaz de armazenar um conjunto de categorias no armazenamento local do dispositivo utilizado para o efetuar o registo através do hub de notificação sempre que o utilizador alterar a seleção de categorias.The app is now complete and can store a set of categories in the device local storage used to register with the notification hub whenever the user changes the selection of categories. Em seguida, defina um back-end apto a enviar notificações de categoria para esta aplicação.Next, define a backend that can send category notifications to this app.

Enviar notificações com etiquetasSend tagged notifications

Nesta secção, irá enviar notícias de última hora como notificações de modelo etiquetadas a partir da aplicação de consola .NET.In this section, you send breaking news as tagged template notifications from a .NET console app.

  1. No Visual Studio, crie um novo elemento Visual C# aplicação de consola: um.In Visual Studio, create a new Visual C# console application: a. No menu, selecione arquivo > New > projeto.On the menu, select File > New > Project. b.b. Expanda Visual C# e selecione ambiente de trabalho do Windows.Expand Visual C#, and select Windows Desktop. c.c. Selecione aplicação de consola (.NET Framework) na lista de modelos.Select Console App (.NET Framework) in the list of templates. d.d. Introduza um nome para a aplicação.Enter a name for the app. e.e. Selecione um pasta para a aplicação.Select a folder for the app. f.f. Selecione OK para criar o projeto.Select OK to create the project.

  2. No menu principal do Visual Studio, selecione ferramentas > Gestor de pacotes NuGet > Package Manager Console e, em seguida, na janela da consola, Introduza a seguinte cadeia:On the Visual Studio main menu, select Tools > NuGet Package Manager > Package Manager Console and then, in the console window, enter the following string:

    Install-Package Microsoft.Azure.NotificationHubs
    
  3. Prima Enter.Select Enter.
    Esta ação adiciona uma referência ao SDK dos Hubs de Notificação do Azure mediante a utilização do Pacote NuGet Microsoft.Azure.Notification Hubs.This action adds a reference to the Azure Notification Hubs SDK by using the Microsoft.Azure.Notification Hubs NuGet package.

  4. Abra o ficheiro Program.cs e adicione a seguinte instrução using:Open the Program.cs file, and add the following using statement:

    using Microsoft.Azure.NotificationHubs;
    
  5. Na classe Program, adicione o seguinte método ou substitua-o se já existir:In the Program class, add the following method, or replace it if it already exists:

    private static async void SendTemplateNotificationAsync()
    {
        // Define the notification hub.
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("<connection string with full access>", "<hub name>");
    
        // 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, 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.This code sends a template notification for each of the six tags in the string array. A utilização de etiquetas assegura que os dispositivos recebem notificações apenas para as categorias registadas.The use of tags ensures that devices receive notifications only for the registered categories.

  6. 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.In the preceding code, replace the <hub name> and <connection string with full access> placeholders with your notification hub name and the connection string for DefaultFullSharedAccessSignature from the dashboard of your notification hub.

  7. No método Principal, adicione as linhas seguintes:In the Main method, add the following lines:

    SendTemplateNotificationAsync();
    Console.ReadLine();
    
  8. Crie a aplicação de consola.Build the console app.

Testar a aplicaçãoTest the app

  1. No Visual Studio, prima F5 para compilar e iniciar a aplicação.In Visual Studio, press F5 to compile and start the app.

    Aplicação móvel com categorias

    A IU da aplicação fornece um conjunto de seletores que lhe permite escolher as categorias que quer subscrever.The app UI provides a set of toggles that lets you choose the categories to subscribe to.

  2. Ative um ou mais seletores de categorias e, em seguida, clique em Subscrever.Enable one or more categories toggles, then click Subscribe.

    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.The app converts the selected categories into tags and requests a new device registration for the selected tags from the notification hub. As categorias registadas são devolvidas e apresentadas numa caixa de diálogo.The registered categories are returned and displayed in a dialog.

    Mensagem de subscrição concluída

  3. Depois de receber uma confirmação de que a subscrição das categorias foi concluída, execute a aplicação de consola para enviar notificações para cada categoria.After receiving a confirmation that your categories were subscription completed, run the console app to send notifications for each category. Certifique-se de que apenas recebe uma notificação para as categorias que subscreveu.Verify you only receive a notification for the categories you have subscribed to.

    Mensagem de notificação

Passos SeguintesNext steps

Neste tutorial, aprendeu a enviar notificações push para dispositivos específicos que têm etiquetas associadas aos respetivos registos.In this tutorial, you learned how to push notifications to specific devices that have tags associated with their registrations. Para saber como enviar notificações push para utilizadores específicos que podem utilizar vários dispositivos, avance para o tutorial seguinte:To learn how to push notifications to specific users who may be using multiple devices, advance to the following tutorial:

Push notifications to specific users (Enviar notificações para utilizadores específicos)Push notifications to specific users