Zelfstudie: Pushmeldingen verzenden naar specifieke Windows Phone-apps met Azure Notification HubsTutorial: Push notifications to specific Windows Phone devices by using Azure Notification Hubs

In deze zelfstudie ziet u hoe u met Azure Notification Hubs pushmeldingen kunt verzenden naar specifieke apparaten met Windows Phone 8 of Windows Phone 8.1.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. Als u ontwikkelt voor Windows Phone 8.1 (zonder Silverlight), raadpleegt u de Windows Universal-versie van deze zelfstudie.If you are targeting Windows Phone 8.1 (non-Silverlight), see the Windows Universal version of this tutorial.

U maakt dit scenario mogelijk door een of meer tags (of labels) toe te voegen wanneer u een registratie maakt in Notifications Hub.You enable this scenario by including one or more tags when creating a registration in the notification hub. Wanneer meldingen worden verzonden naar een tag, ontvangen alle apparaten die zich hebben geregistreerd voor de tag de melding.When notifications are sent to a tag, all devices that have registered for the tag receive the notification. Zie Tags in registraties voor meer informatie over tags.For more information about tags, see Tags in registrations.

Notitie

De Notification Hubs Windows Phone SDK biedt geen ondersteuning voor het gebruik van Windows Push Notification Service (WNS) met Windows Phone 8.1 Silverlight-apps.The Notification Hubs Windows Phone SDK does not support using the Windows Push Notification Service (WNS) with Windows Phone 8.1 Silverlight apps. Als u WNS (in plaats van MPNS) met Windows Phone 8.1 Silverlight-apps wilt gebruiken, raadpleegt u de Notification Hubs - Windows Phone Silverlight tutorial (Notification Hubs: zelfstudie voor Windows Phone Silverlight) waarin REST API's worden gebruikt.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.

In deze zelfstudie leert u het volgende:In this tutorial, you learn how to:

  • Categorieselectie toevoegen aan de mobiele appAdd category selection to the mobile app
  • Registreren voor meldingen met tagsRegister for notifications with tags
  • Getagde meldingen verzendenSend tagged notifications
  • De app testenTest the app

VereistenPrerequisites

U moet de Zelfstudie: Pushmeldingen verzenden naar Windows Phone-apps met Azure Notification Hubs.Complete the Tutorial: Push notifications to Windows Phone apps by using Azure Notification Hubs. In deze zelfstudie werkt u de mobiele toepassing zij, zodat u zich kunt registreren voor nieuwscategorieën waarin u geïnteresseerd bent en u alleen voor die categorieën pushmeldingen ontvangt als er belangrijk nieuws is.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.

Categorieselectie toevoegen aan de mobiele appAdd category selection to the mobile app

De eerste stap is het toevoegen van UI-elementen aan de bestaande hoofdpagina, zodat gebruikers categorieën kunnen selecteren waarvoor ze zich willen registreren.The first step is to add the UI elements to your existing main page that enable the user to select categories to register. De geselecteerde categorieën worden op het apparaat opgeslagen.The categories selected by a user are stored on the device. Wanneer de app wordt gestart, wordt er een apparaatregistratie gemaakt in uw meldingshub, met de geselecteerde categorieën als tags.When the app starts, a device registration is created in your notification hub with the selected categories as tags.

  1. Open het bestand MainPage.xaml en vervang de Grid-elementen TitlePanel en ContentPanel door de volgende code: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. Voeg een klasse met de naam Notifications toe aan het project.Add a class named Notifications to the project. Voeg de modifier public toe aan de klassedefinitie.Add the public modifier to the class definition. Voeg vervolgens de volgende using-instructies toe aan het nieuwe codebestand: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. Kopieer de volgende code naar de nieuwe klasse Notifications: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());
        });
    }
    

    Deze klasse gebruikt de geïsoleerde opslag voor het opslaan van de nieuwscategorieën die dit apparaat moet ontvangen.This class uses the isolated storage to store the categories of news that this device is to receive. De klasse bevat ook methoden om te registreren voor deze categorieën met behulp van een sjabloon.It also contains methods to register for these categories using a template notification registration.

  4. Voeg in het projectbestand App.xaml.cs de volgende eigenschap toe aan de klasse App.In the App.xaml.cs project file, add the following property to the App class. Vervang de tijdelijke aanduidingen <hub name> en <connection string with listen access> door de naam van de meldingshub en de verbindingsreeks voor DefaultFullSharedAccessSignature die u eerder hebt opgevraagd.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>");
    

    Notitie

    Omdat referenties die worden gedistribueerd met een client-app meestal niet beveiligd zijn, moet u met uw client-app alleen de sleutel voor listen-toegang distribueren.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. Uw app kan dan worden geregistreerd voor meldingen, maar bestaande registraties kunnen niet worden gewijzigd, en er kunnen geen meldingen worden verzonden.Listen access enables your app to register for notifications, but existing registrations cannot be modified and notifications cannot be sent. De sleutel voor volledige toegang wordt gebruikt in een beveiligde back-endservice voor het verzenden van meldingen en het wijzigen van bestaande registraties.The full access key is used in a secured backend service for sending notifications and changing existing registrations.

  5. Voeg in MainPage.xaml.cs de volgende regel toe:In the MainPage.xaml.cs, add the following line:

    using Windows.UI.Popups;
    
  6. Voeg in het projectbestand MainPage.xaml.cs de volgende methode toe: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);
    }
    

    Met deze methode maakt u een lijst met categorieën en gebruikt u de klasse Notifications om de lijst op te slaan in de lokale opslag en de bijbehorende tags te registreren bij uw Notification Hub.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. Wanneer categorieën worden gewijzigd, wordt de registratie opnieuw gemaakt met de nieuwe categorieën.When categories are changed, the registration is recreated with the new categories.

Uw app kan nu een set categorieën opslaan in de lokale opslag op het apparaat en deze registreren bij de meldingshub wanneer de gebruiker de selectie van categorieën wijzigt.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.

Registreren voor meldingenRegister for notifications

Met deze stappen registreert u zich tijdens het opstarten bij de meldingshub met behulp van de categorieën die zijn opgeslagen in de lokale opslag.These steps register with the notification hub on startup using the categories that have been stored in local storage.

Notitie

Omdat de kanaal-URI die wordt toegewezen door MPNS (Microsoft Push Notification Service) op elk moment kan veranderen, moet u zich regelmatig registreren voor meldingen om fouten te voorkomen.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. In dit voorbeeld wordt er elke keer dat de app wordt gestart een registratie voor meldingen vastgelegd.This example registers for notifications every time that the app starts. Voor apps die u regelmatig uitvoert (meer dan één keer per dag), kunt u de registratie waarschijnlijk overslaan om bandbreedte te besparen als er minder dan een dag is verstreken sinds de vorige registratie.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. Open het bestand App.xaml.cs en voeg de modifier async toe aan de methode Application_Launching en vervang de registratiecode van Notification Hubs die u hebt toegevoegd in Aan de slag met Notification Hubs door de volgende code: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);
            });
    }
    

    Deze code zorgt ervoor dat wanneer de app wordt gestart, de categorieën worden opgehaald uit de lokale opslag en registratie voor deze categorieën wordt aangevraagd.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. Voeg in het projectbestand MainPage.xaml.cs de volgende code toe om de methode OnNavigatedTo te implementeren: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;
    }
    

    Met deze code wordt de hoofdpagina bijgewerkt op basis van de status van eerder opgeslagen categorieën.This code updates the main page based on the status of previously saved categories.

De app is nu klaar en kan een set categorieën opslaan in de lokale opslag op het apparaat en deze registreren bij de meldingshub wanneer de gebruiker de selectie van categorieën wijzigt.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. U gaat nu een back-end definiëren die categoriemeldingen naar deze app kan verzenden.Next, define a backend that can send category notifications to this app.

Getagde meldingen verzendenSend tagged notifications

In deze sectie verzendt u het laatste nieuws als gelabelde sjabloonmeldingen vanuit een .NET-console-app.In this section, you send breaking news as tagged template notifications from a .NET console app.

  1. Maak in Visual Studio een nieuwe Visual C#-consoletoepassing:In Visual Studio, create a new Visual C# console application:

    1. Selecteer in het menu bestand > Nieuw > -project.On the menu, select File > New > Project.
    2. Selecteer in een nieuw project makende optie console-app (.NET Framework) voor C# in de lijst met sjablonen en selecteer volgende.In Create a new project, select Console App (.NET Framework) for C# in the list of templates, and select Next.
    3. Voer een naam in voor de app.Enter a name for the app.
    4. Voor oplossingkiest u toevoegen aan oplossingen selecteert u maken om het project te maken.For Solution, choose Add to solution, and select Create to create the project.
  2. Selecteer extra > NuGet package manager > Package Manager-console en voer vervolgens in het console venster de volgende opdracht uit:Select Tools > NuGet Package Manager > Package Manager Console and then, in the console window, run the following command:

    Install-Package Microsoft.Azure.NotificationHubs
    

    Met deze actie wordt een verwijzing toegevoegd aan de Azure Notification Hubs SDK met behulp van het pakket micro soft. Azure. notification hubs .This action adds a reference to the Azure Notification Hubs SDK by using the Microsoft.Azure.NotificationHubs package.

  3. Open het Program.cs -bestand en voeg de volgende using-instructie toe:Open the Program.cs file, and add the following using statement:

    using Microsoft.Azure.NotificationHubs;
    
  4. Voeg in de klasse Program de volgende methode toe of vervang de methode als deze al bestaat: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);
        }
    }
    

    Met deze code wordt een sjabloonmelding verzonden voor elk van de zes labels in de tekenreeksmatrix.This code sends a template notification for each of the six tags in the string array. Het gebruik van labels zorgt ervoor dat apparaten meldingen ontvangen voor de geregistreerde categorieën.The use of tags ensures that devices receive notifications only for the registered categories.

  5. Vervang in de voorgaande code de tijdelijke aanduidingen <hub name> en <connection string with full access> door de naam van de meldingenhub en de verbindingsreeks voor DefaultFullSharedAccessSignature uit het dashboard van de meldingenhub.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.

  6. Voeg in de methode Main() de volgende regels toe:In the Main() method, add the following lines:

     SendTemplateNotificationAsync();
     Console.ReadLine();
    
  7. Bouw de console-app.Build the console app.

De app testenTest the app

  1. Druk in Visual Studio op F5 om de app te compileren en te starten.In Visual Studio, press F5 to compile and start the app.

    Mobiele app met categorieën

    De UI van de app biedt een reeks schakelopties waarmee u de categorieën kunt kiezen waarop u zich wilt abonneren.The app UI provides a set of toggles that lets you choose the categories to subscribe to.

  2. Zet een of meer categorieën op On en klik vervolgens op Subscribe.Enable one or more categories toggles, then click Subscribe.

    De app zet de geselecteerde categorieën om in tags en vraagt bij Notification Hubs een nieuwe apparaatregistratie aan voor de geselecteerde tags.The app converts the selected categories into tags and requests a new device registration for the selected tags from the notification hub. De geregistreerde categorieën worden geretourneerd en weergegeven in een dialoogvenster.The registered categories are returned and displayed in a dialog.

    Bericht dat abonneren is gelukt

  3. Na ontvangst van een bevestiging dat het abonnement voor uw categorieën is voltooid, voert u de console-app uit om meldingen voor elke categorie te verzenden.After receiving a confirmation that your categories were subscription completed, run the console app to send notifications for each category. Controleer of u alleen een melding ontvangt voor de categorieën waarop u zich hebt geabonneerd.Verify you only receive a notification for the categories you have subscribed to.

    Melding

Volgende stappenNext steps

In deze zelfstudie hebt u geleerd hoe u pushmeldingen kunt verzenden naar specifieke apparaten door een tag te koppelen aan hun registraties.In this tutorial, you learned how to push notifications to specific devices that have tags associated with their registrations. Als u wilt weten hoe u pushmeldingen kunt verzenden naar specifieke gebruikers die mogelijk meerdere apparaten gebruiken, gaat u verder met de volgende zelfstudie:To learn how to push notifications to specific users who may be using multiple devices, advance to the following tutorial: