Självstudie: Skicka meddelanden till specifika enheter som kör Universell Windows-plattform program

Anteckning

Microsoft Push Notification Service (MPNS) har blivit inaktuell och stöds inte längre.

Översikt

Den här självstudien visar hur du använder Azure Notification Hubs för att sända meddelanden om senaste nytt. Den här självstudien beskriver Windows Store- eller Windows Phone 8.1-program (inte Silverlight). Om du riktar in dig på Windows Phone 8.1 Silverlight kan du läsa Push-meddelanden till specifika Windows Phone enheter med hjälp av Azure Notification Hubs.

I den här självstudien får du lära dig hur du använder Azure Notification Hubs för att skicka push-meddelanden till specifika Windows-enheter som kör ett Universell Windows-plattform-program (UWP). När du har slutfört självstudien kan du registrera dig för de senaste nyhetskategorierna som du är intresserad av. Du får bara push-meddelanden för dessa kategorier.

Om du vill aktivera sändningsscenarier inkluderar du en eller flera taggar när du skapar en registrering i meddelandehubben. När meddelanden skickas till en tagg får alla enheter som är registrerade för taggen meddelandet. Mer information om taggar finns i Routning och tagguttryck.

Anteckning

Windows Store och Windows Phone-projektversionerna 8.1 och tidigare stöds inte i Visual Studio 2019. Mer information finns i Visual Studio 2019 Platform Targeting and Compatibility (Plattformsmål och kompatibilitet i Visual Studio 2019).

I den här självstudien utför du följande uppgifter:

  • Lägga till kategorival i mobilappen
  • Registrera sig för meddelanden
  • Skicka taggade meddelanden
  • Kör appen och generera meddelanden

Förutsättningar

Slutför Självstudier: Skicka meddelanden till Universal Windows Platform-appar med hjälp av Azure Notification Hubs innan du startar den här självstudiekursen.

Lägga till kategorival till appen

Det första steget är att lägga till UI-element till din befintliga huvudsida så att användarna kan välja kategorier att registrera. De valda kategorierna lagras på enheten. När appen startar skapas en enhetsregistrering i meddelandehubben med de valda kategorierna som taggar.

  1. Öppna projektfilen MainPage.xaml och kopiera sedan följande kod i -elementet Grid :

    <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. I Solution Explorer högerklickar du på projektet och väljer Lägg till>klass. I Lägg till nytt objektnamnger du klassen Meddelanden och väljer Lägg till. Om det behövs lägger du till public modifieraren i klassdefinitionen.

  3. Lägg till följande using -instruktioner i den nya filen:

    using Windows.Networking.PushNotifications;
    using Microsoft.WindowsAzure.Messaging;
    using Windows.Storage;
    using System.Threading.Tasks;
    
  4. Kopiera följande kod till den nya Notifications-klassen:

    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);
    }
    

    Den här klassen använder lokal lagring för att lagra de nyhetskategorier som den här enheten ska ta emot. I stället för att anropa metoden RegisterNativeAsync anropar du RegisterTemplateAsync om du vill registrera för kategorierna med hjälp av en mallregistrering.

    Om du vill registrera fler än en mall anger du ett mallnamn, till exempel simpleWNSTemplateExample. Du namnger mallarna så att du kan uppdatera eller ta bort dem. Du kan registrera fler än en mall för att ha en för popup-meddelanden och en för paneler.

    Anteckning

    Med Notification Hubs kan en enhet registrera flera mallar med hjälp av samma tagg. I det här fallet resulterar ett inkommande meddelande som riktar sig mot taggen i att flera meddelanden levereras till enheten, ett för varje mall. Med den här processen kan du visa samma meddelande i flera visuella meddelanden, till exempel både som ett märke och som ett popup-meddelande i en Windows Store-app.

    Mer information finns i Mallar.

  5. I projektfilen App.xaml.cs lägger du till följande egenskap i App klassen :

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

    Den här egenskapen används för att skapa och få åtkomst till en Notifications-instans.

    Ersätt platshållarna <hub name> och <connection string with listen access> i koden med namnet på din meddelandehubb och anslutningssträngen för DefaultListenSharedAccessSignature som du fick tidigare.

    Anteckning

    Eftersom autentiseringsuppgifterna som distribueras med ett klientprogram vanligtvis inte är säkra så distribuera bara nyckeln för lyssningsåtkomst med din klientapp. Med lyssna-åtkomst kan du registrera din app för meddelanden, men befintliga registreringar kan inte ändras och meddelanden kan inte skickas. Nyckelln för fullständig åtkomst används i en skyddad serverdelstjänst för att skicka meddelanden och ändra befintliga registreringar.

  6. Lägg till följande rad i filen MainPage.xaml.cs :

    using Windows.UI.Popups;
    
  7. Lägg till följande metod i filen MainPage.xaml.cs :

    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();
    }
    

    Den här metoden skapar en lista över kategorier och använder klassen Notifications för att lagra listan lokalt. Det garanterar även motsvarande taggar med meddelandehubben. När kategorierna ändras återskapas registreringen med de nya kategorierna.

Din app kan nu användas för att lagra en uppsättning kategorier i lokal lagring på enheten. Appen registreras i meddelandehubben närhelst användare ändrar kategoriurvalet.

Registrera sig för meddelanden

I det här avsnittet registrerar du med meddelandehubben vid start med hjälp av de kategorier som du har lagrat lokalt.

Anteckning

Eftersom den kanal-URI som tilldelats av Windows Notification Service (WNS) kan ändras när som helst bör du ofta registrera dig för meddelanden för att undvika meddelandefel. Det här exemplet registrerar för meddelande varje gång som appen startas. För appar som du kör ofta, till exempel mer än en gång om dagen, kan du förmodligen hoppa över registreringen för att bevara bandbredden om mindre än en dag har passerat sedan den tidigare registreringen.

  1. Om du vill använda notifications klassen för att prenumerera baserat på kategorier öppnar du filen App.xaml.cs och uppdaterar InitNotificationsAsync sedan metoden.

    // *** 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();
    

    Den här processen säkerställer att när appen startar hämtar den kategorierna från lokal lagring. Den begär sedan registrering av dessa kategorier. Du skapade InitNotificationsAsync metoden som en del av självstudien Skicka meddelanden till Universell Windows-plattform-appar med hjälp av Azure Notification Hubs.

  2. I projektfilen MainPage.xaml.cs lägger du till följande kod i OnNavigatedTo metoden :

    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;
    }
    

    Den här koden uppdaterar huvudsidan baserat på tidigare sparade kategoriers status.

Appen är nu klar. Den kan lagra en uppsättning kategorier i enhetens lokala lagring. När användarna ändrar kategorivalet används de sparade kategorierna för att registrera sig i meddelandehubben. I nästa avsnitt definierar du en serverdel som kan skicka kategorimeddelanden till den här appen.

Kör UWP-appen

  1. Kompilera och starta appen genom att trycka på F5 i Visual Studio. Appens användargränssnitt innehåller en uppsättning växlar med vilka du kan välja vilka kategorier du vill prenumerera på.

    Senaste nytt-app

  2. Aktivera en eller flera kategoriväxlingar och välj sedan Prenumerera.

    Appen konverterar de valda kategorierna till taggar och begär en ny enhetsregistrering för de valda taggarna från meddelandehubben. Appen visar de registrerade kategorierna i en dialogruta.

    Kategoriväxlingsknapparna och prenumerationsknappen

Skapa en konsolapp för att skicka taggade meddelanden

I det här avsnittet skickar du de senaste nyheterna som taggade mallmeddelanden från en .NET-konsolapp.

  1. Skapa en ny Visual C#-konsolapp i Visual Studio:

    1. Välj Arkiv>Nytt>projekt på menyn.
    2. I Skapa ett nytt projekt väljer du Konsolapp (.NET Framework) för C# i listan med mallar och väljer Nästa.
    3. Ange ett namn för appen.
    4. För Lösning väljer du Lägg till i lösning och sedan Skapa för att skapa projektet.
  2. Välj Verktyg>NuGet Package ManagerPackage Manager> Console och kör sedan följande kommando i konsolfönstret:

    Install-Package Microsoft.Azure.NotificationHubs
    

    Den här åtgärden lägger till en referens till Azure Notification Hubs SDK med hjälp av paketet Microsoft.Azure.NotificationHubs .

  3. Öppna filen Program.cs och lägg till följande using instruktion:

    using Microsoft.Azure.NotificationHubs;
    
  4. I Program-klassen, lägger du till följande metod eller ersätter den om den redan finns:

    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);
        }
    }
    

    Den här koden skickar ett mallmeddelande för var och en av de sex taggarna i strängmatrisen. Användning av taggar garanterar att enheter endast får meddelanden för registrerade kategorier.

  5. I föregående kod, ersätter du <hub name>- och <connection string with full access>-platshållarna med namnet på din meddelandehubb och anslutningssträngen för DefaultFullSharedAccessSignature från instrumentpanelen i din meddelandehubb.

  6. Lägg till följande rader i Main() metoden:

     SendTemplateNotificationAsync();
     Console.ReadLine();
    
  7. Skapa konsolappen.

Kör konsolappen för att skicka taggade meddelanden

Kör appen som skapades i föregående avsnitt. Meddelanden för de valda kategorierna visas som popup-meddelanden.

Nästa steg

I den här artikeln beskrivs hur du skickar senaste nytt efter kategori. Serverdelsprogrammet skickar taggade meddelanden till enheter som har registrerats för att ta emot meddelanden för taggen. Om du vill veta hur du skickar meddelanden till specifika användare oberoende av vilken enhet de använder går du vidare till följande självstudie: