Share via


Självstudie: Skicka push-meddelanden till specifika iOS-enheter med Hjälp av Azure Notification Hubs

Översikt

Den här självstudien visar hur du använder Azure Notification Hubs för att sända meddelanden om senaste nytt till en iOS-app. När du är klar kan du registrera dig för nyhetskategorier som du är intresserad av och bara få push-meddelanden för dessa kategorier. Det här scenariot är ett vanligt mönster för många appar där meddelanden måste skickas till olika grupper av användare som tidigare har deklarerat intresse för dem, t.ex. RSS-läsare, appar för musiklyssnare osv.

Du aktiverar sändningsscenarier genom att inkludera en eller flera taggar när du skapar en registrering i meddelandehubben. När meddelanden skickas till en tagg får enheter som har registrerats för taggen meddelandet. Eftersom taggar bara är strängar behöver de inte etableras i förväg. Mer information om taggar finns i Notification Hubs-routning och tagguttryck.

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

  • Lägga till en kategorimarkering i appen
  • Skicka taggade meddelanden
  • Skicka meddelanden från enheten
  • Kör appen och generera meddelanden

Förutsättningar

Det här avsnittet bygger på den app som du skapade i Självstudie: Push-meddelanden till iOS-appar med Azure Notification Hubs. Innan du påbörjar den här självstudien måste du redan ha slutfört Självstudie: Skicka meddelanden till iOS-appar med Azure Notification Hubs.

Lägga till kategorival till appen

Det första steget är att lägga till gränssnittselementen i din befintliga storyboard som gör det möjligt för användaren att välja kategorier att registrera. De kategorier som valts av en användare lagras på enheten. När appen startar skapas en enhetsregistrering i din meddelandehubb med de valda kategorierna som taggar.

  1. Lägg till följande komponenter från objektbiblioteket i din MainStoryboard_iPhone.storyboard :

    • En etikett med texten "Senaste nytt",

    • Etiketter med kategoritexterna "World", "Politics", "Business", "Technology", "Science", "Sports",

    • Sex växlar, en per kategori, anger att varje växelstatus är Av som standard.

    • En knapp med etiketten "Prenumerera"

      Din storyboard bör se ut så här:

      Xcode-gränssnittsbyggare

  2. I den biträdande redigeraren skapar du försäljningsställen för alla switchar och kallar dem "WorldSwitch", "PoliticsSwitch", "BusinessSwitch", "TechnologySwitch", "ScienceSwitch", "SportsSwitch"

  3. Skapa en åtgärd för knappen med namnet subscribe. Du ViewController.h bör innehålla följande kod:

    @property (weak, nonatomic) IBOutlet UISwitch *WorldSwitch;
    @property (weak, nonatomic) IBOutlet UISwitch *PoliticsSwitch;
    @property (weak, nonatomic) IBOutlet UISwitch *BusinessSwitch;
    @property (weak, nonatomic) IBOutlet UISwitch *TechnologySwitch;
    @property (weak, nonatomic) IBOutlet UISwitch *ScienceSwitch;
    @property (weak, nonatomic) IBOutlet UISwitch *SportsSwitch;
    
    - (IBAction)subscribe:(id)sender;
    
  4. Skapa en ny Cocoa Touch-klass med namnet Notifications. Kopiera följande kod i gränssnittsavsnittet i filen Notifications.h:

    @property NSData* deviceToken;
    
    - (id)initWithConnectionString:(NSString*)listenConnectionString HubName:(NSString*)hubName;
    
    - (void)storeCategoriesAndSubscribeWithCategories:(NSArray*)categories
                completion:(void (^)(NSError* error))completion;
    
    - (NSSet*)retrieveCategories;
    
    - (void)subscribeWithCategories:(NSSet*)categories completion:(void (^)(NSError *))completion;
    
  5. Lägg till följande importdirektiv i Notifications.m:

    #import <WindowsAzureMessaging/WindowsAzureMessaging.h>
    
  6. Kopiera följande kod i implementeringsavsnittet i filen Notifications.m.

    SBNotificationHub* hub;
    
    - (id)initWithConnectionString:(NSString*)listenConnectionString HubName:(NSString*)hubName{
    
        hub = [[SBNotificationHub alloc] initWithConnectionString:listenConnectionString
                                    notificationHubPath:hubName];
    
        return self;
    }
    
    - (void)storeCategoriesAndSubscribeWithCategories:(NSSet *)categories completion:(void (^)(NSError *))completion {
        NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
        [defaults setValue:[categories allObjects] forKey:@"BreakingNewsCategories"];
    
        [self subscribeWithCategories:categories completion:completion];
    }
    
    - (NSSet*)retrieveCategories {
        NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    
        NSArray* categories = [defaults stringArrayForKey:@"BreakingNewsCategories"];
    
        if (!categories) return [[NSSet alloc] init];
        return [[NSSet alloc] initWithArray:categories];
    }
    
    - (void)subscribeWithCategories:(NSSet *)categories completion:(void (^)(NSError *))completion
    {
        NSString* templateBodyAPNS = @"{\"aps\":{\"alert\":\"$(messageParam)\"}}";
    
        [hub registerTemplateWithDeviceToken:self.deviceToken name:@"simpleAPNSTemplate" 
            jsonBodyTemplate:templateBodyAPNS expiryTemplate:@"0" tags:categories completion:completion];
    }
    

    Den här klassen använder lokal lagring för att lagra och hämta de nyhetskategorier som den här enheten tar emot. Dessutom innehåller den en metod för att registrera för dessa kategorier med hjälp av en mallregistrering .

  7. AppDelegate.h I filen lägger du till en importinstruktion för Notifications.h och lägger till en egenskap för en instans av Notifications klassen:

    #import "Notifications.h"
    
    @property (nonatomic) Notifications* notifications;
    
  8. didFinishLaunchingWithOptions I -metoden i AppDelegate.mlägger du till koden för att initiera meddelandeinstansen i början av metoden.
    HUBNAME och HUBLISTENACCESS (definieras i hubinfo.h) bör redan ha <hub name> platshållarna och <connection string with listen access> ersatta med namnet på meddelandehubben och anslutningssträngen för DefaultListenSharedAccessSignature som du hämtade tidigare

    self.notifications = [[Notifications alloc] initWithConnectionString:HUBLISTENACCESS HubName:HUBNAME];
    

    Anteckning

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

  9. didRegisterForRemoteNotificationsWithDeviceToken I -metoden i AppDelegate.mersätter du koden i metoden med följande kod för att skicka enhetstoken till notifications klassen . Klassen notifications utför registreringen för meddelanden med kategorierna. Om användaren ändrar kategorival anropar subscribeWithCategories du metoden som svar på prenumerationsknappen för att uppdatera dem.

    Anteckning

    Eftersom enhetstoken som tilldelats av Apple Push Notification Service (APNS) kan ändras när som helst bör du registrera dig för meddelanden ofta för att undvika meddelandefel. Det här exemplet registrerar för meddelande varje gång som appen startas. För appar som körs ofta, mer än en gång om dagen, kan du förmodligen hoppa över registreringen och spara bandbredd om mindre än en dag har gått sedan den tidigare registreringen.

    self.notifications.deviceToken = deviceToken;
    
    // Retrieves the categories from local storage and requests a registration for these categories
    // each time the app starts and performs a registration.
    
    NSSet* categories = [self.notifications retrieveCategories];
    [self.notifications subscribeWithCategories:categories completion:^(NSError* error) {
        if (error != nil) {
            NSLog(@"Error registering for notifications: %@", error);
        }
    }];
    

    I det här läget bör det inte finnas någon annan kod i didRegisterForRemoteNotificationsWithDeviceToken metoden .

  10. Följande metoder bör redan finnas med i AppDelegate.m självstudiekursen Kom igång med Notification Hubs . Om inte lägger du till dem.

    - (void)MessageBox:(NSString *)title message:(NSString *)messageText
    {
    
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:messageText delegate:self
            cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];
    }
    
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:
       (NSDictionary *)userInfo {
       NSLog(@"%@", userInfo);
       [self MessageBox:@"Notification" message:[[userInfo objectForKey:@"aps"] valueForKey:@"alert"]];
     }
    

    Den här metoden hanterar meddelanden som tas emot när appen körs genom att visa ett enkelt UIAlert.

  11. I ViewController.mlägger du till en import -instruktion för AppDelegate.h och kopierar följande kod till den XCode-genererade subscribe metoden. Den här koden uppdaterar meddelanderegistreringen så att den använder de nya kategoritaggar som användaren har valt i användargränssnittet.

    #import "Notifications.h"
    
    NSMutableArray* categories = [[NSMutableArray alloc] init];
    
    if (self.WorldSwitch.isOn) [categories addObject:@"World"];
    if (self.PoliticsSwitch.isOn) [categories addObject:@"Politics"];
    if (self.BusinessSwitch.isOn) [categories addObject:@"Business"];
    if (self.TechnologySwitch.isOn) [categories addObject:@"Technology"];
    if (self.ScienceSwitch.isOn) [categories addObject:@"Science"];
    if (self.SportsSwitch.isOn) [categories addObject:@"Sports"];
    
    Notifications* notifications = [(AppDelegate*)[[UIApplication sharedApplication]delegate] notifications];
    
    [notifications storeCategoriesAndSubscribeWithCategories:categories completion: ^(NSError* error) {
        if (!error) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:"Notification" message:"Subscribed" delegate:self
            cancelButtonTitle:@"OK" otherButtonTitles: nil];
            [alert show];
        } else {
            NSLog(@"Error subscribing: %@", error);
        }
    }];
    

    Den här metoden skapar en NSMutableArray av kategorier och använder Notifications klassen för att lagra listan i den lokala lagringen och registrerar motsvarande taggar med meddelandehubben. När kategorier ändras återskapas registreringen med de nya kategorierna.

  12. I ViewController.mlägger du till följande kod i viewDidLoad -metoden för att ange användargränssnittet baserat på de tidigare sparade kategorierna.

    // This updates the UI on startup based on the status of previously saved categories.
    
    Notifications* notifications = [(AppDelegate*)[[UIApplication sharedApplication]delegate] notifications];
    
    NSSet* categories = [notifications retrieveCategories];
    
    if ([categories containsObject:@"World"]) self.WorldSwitch.on = true;
    if ([categories containsObject:@"Politics"]) self.PoliticsSwitch.on = true;
    if ([categories containsObject:@"Business"]) self.BusinessSwitch.on = true;
    if ([categories containsObject:@"Technology"]) self.TechnologySwitch.on = true;
    if ([categories containsObject:@"Science"]) self.ScienceSwitch.on = true;
    if ([categories containsObject:@"Sports"]) self.SportsSwitch.on = true;
    

Appen kan nu lagra en uppsättning kategorier i enhetens lokala lagring som används för att registrera med meddelandehubben när appen startar. Användaren kan ändra valet av kategorier vid körning och klicka på subscribe metoden för att uppdatera registreringen för enheten. Därefter uppdaterar du appen för att skicka meddelanden om de senaste nyheterna direkt i själva appen.

(valfritt) Skicka taggade meddelanden

Om du inte har åtkomst till Visual Studio kan du gå vidare till nästa avsnitt och skicka meddelanden från själva appen. Du kan också skicka rätt mallavisering från Azure Portal med hjälp av felsökningsfliken för meddelandehubben.

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.

(valfritt) Skicka meddelanden från enheten

Normalt skickas meddelanden av en serverdelstjänst, men du kan skicka meddelanden om senaste nytt direkt från appen. Det gör du genom att uppdatera den SendNotificationRESTAPI metod som du definierade i självstudien Kom igång med Notification Hubs .

  1. I ViewController.muppdaterar SendNotificationRESTAPI du metoden på följande sätt så att den accepterar en parameter för kategoritaggen och skickar rätt mallavisering .

    - (void)SendNotificationRESTAPI:(NSString*)categoryTag
    {
        NSURLSession* session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration
                                    defaultSessionConfiguration] delegate:nil delegateQueue:nil];
    
        NSString *json;
    
        // Construct the messages REST endpoint
        NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@/messages/%@", HubEndpoint,
                                            HUBNAME, API_VERSION]];
    
        // Generated the token to be used in the authorization header.
        NSString* authorizationToken = [self generateSasToken:[url absoluteString]];
    
        //Create the request to add the template notification message to the hub
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        [request setHTTPMethod:@"POST"];
    
        // Add the category as a tag
        [request setValue:categoryTag forHTTPHeaderField:@"ServiceBusNotification-Tags"];
    
        // Template notification
        json = [NSString stringWithFormat:@"{\"messageParam\":\"Breaking %@ News : %@\"}",
                categoryTag, self.notificationMessage.text];
    
        // Signify template notification format
        [request setValue:@"template" forHTTPHeaderField:@"ServiceBusNotification-Format"];
    
        // JSON Content-Type
        [request setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    
        //Authenticate the notification message POST request with the SaS token
        [request setValue:authorizationToken forHTTPHeaderField:@"Authorization"];
    
        //Add the notification message body
        [request setHTTPBody:[json dataUsingEncoding:NSUTF8StringEncoding]];
    
        // Send the REST request
        NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request
                    completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
            {
            NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response;
                if (error || httpResponse.statusCode != 200)
                {
                    NSLog(@"\nError status: %d\nError: %@", httpResponse.statusCode, error);
                }
                if (data != NULL)
                {
                    //xmlParser = [[NSXMLParser alloc] initWithData:data];
                    //[xmlParser setDelegate:self];
                    //[xmlParser parse];
                }
            }];
    
        [dataTask resume];
    }
    
  2. I ViewController.muppdaterar du Send Notification åtgärden enligt följande kod. Så att den skickar meddelandena med varje tagg individuellt och skickar till flera plattformar.

    - (IBAction)SendNotificationMessage:(id)sender
    {
        self.sendResults.text = @"";
    
        NSArray* categories = [NSArray arrayWithObjects: @"World", @"Politics", @"Business",
                                @"Technology", @"Science", @"Sports", nil];
    
        // Lets send the message as breaking news for each category to WNS, FCM, and APNS
        // using a template.
        for(NSString* category in categories)
        {
            [self SendNotificationRESTAPI:category];
        }
    }
    
  3. Återskapa projektet och kontrollera att du inte har några byggfel.

Kör appen och generera meddelanden

  1. Tryck på Run (Kör) för att skapa projektet och starta appen. Välj några alternativ för senaste nytt att prenumerera på och tryck sedan på knappen Prenumerera . Du bör se en dialogruta som anger att meddelandena har prenumererats på.

    Exempelmeddelande på iOS

    När du väljer Prenumerera konverterar appen de valda kategorierna till taggar och begär en ny enhetsregistrering för de valda taggarna från meddelandehubben.

  2. Ange ett meddelande som ska skickas som senaste nytt och tryck sedan på knappen Skicka meddelande . Du kan också köra .NET-konsolappen för att generera meddelanden.

    Ändra meddelandeinställningar i iOS

  3. Varje enhet som prenumererar på senaste nytt får de senaste nyhetsmeddelandena som du just skickade.

Nästa steg

I den här självstudien skickade du sändningsmeddelanden till specifika iOS-enheter som har registrerats för kategorierna. Om du vill lära dig hur du push-överför lokaliserade meddelanden går du vidare till följande självstudie: