Zelfstudie: Pushmeldingen verzenden naar specifieke iOS-apparaten met behulp van Azure Notification Hubs

Overzicht

In deze zelfstudie leert u hoe u Azure Notification Hubs gebruikt om belangrijke nieuwsmeldingen uit te zenden naar een iOS-app. Wanneer u klaar bent, kunt u zich registreren voor belangrijke nieuwscategorieën waarin u geïnteresseerd bent en alleen pushmeldingen ontvangen voor deze categorieën. Dit scenario is een algemeen patroon voor veel apps die meldingen moeten verzenden naar groepen gebruikers die eerder hebben aangegeven in bepaalde onderwerpen geïnteresseerd te zijn, zoals een RSS-lezer, apps voor muziekfans, enzovoort.

Broadcast-scenario's zijn mogelijk door een of meer tags (of labels) toe te voegen wanneer u een registratie maakt in Notifications Hub. Wanneer meldingen naar een tag worden verzonden, ontvangen apparaten die zijn geregistreerd voor de tag de melding. Omdat tags niet meer dan tekenreeksen zijn, hoeven ze niet vooraf te worden opgesteld. Zie Notification Hubs-routering en tagexpressies voor meer informatie over tags.

In deze zelfstudie voert u de volgende stappen uit:

  • Een categorieselectie toevoegen aan de app
  • Getagde meldingen verzenden
  • Meldingen verzenden vanaf het apparaat
  • De app uitvoeren en meldingen genereren

Vereisten

Dit onderwerp bouwt voort op de app die u hebt gemaakt in Zelfstudie: Pushmeldingen verzenden naar iOS-apps met behulp van Azure Notification Hubs. Voordat u aan deze zelfstudie begint, moet u zelfstudie : Pushmeldingen verzenden naar iOS-apps met behulp van Azure Notification Hubs al hebben voltooid.

Categorieselectie toevoegen aan de app

De eerste stap is het toevoegen van de ui-elementen aan uw bestaande storyboard waarmee de gebruiker categorieën kan selecteren die moeten worden geregistreerd. De geselecteerde categorieën worden op het apparaat opgeslagen. Wanneer de app wordt gestart, wordt er een apparaatregistratie gemaakt in uw meldingshub, met de geselecteerde categorieën als tags.

  1. Voeg in uw MainStoryboard_iPhone.storyboard de volgende onderdelen uit de objectbibliotheek toe:

    • Een label met de tekst 'Breaking News',

    • Labels met categorieteksten "Wereld", "Politiek", "Business", "Technologie", "Wetenschap", "Sport",

    • Zes schakelopties, één per categorie, stellen elke schakelaarstatus standaard in op Uit .

    • Eén knop met het label 'Abonneren'

      Uw storyboard moet er als volgt uitzien:

      Opbouwfunctie voor Xcode-interface

  2. Maak in de assistenteditor stopcontacten voor alle switches en noem ze 'WorldSwitch', 'PoliticsSwitch', 'BusinessSwitch', 'TechnologySwitch', 'ScienceSwitch', 'SportsSwitch'

  3. Maak een actie voor de knop met de naam subscribe. uw ViewController.h moet de volgende code bevatten:

    @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. Maak een nieuwe Cocoa Touch-klasse met de naam Notifications. Kopieer de volgende code in de interfacesectie van het bestand 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. Voeg de volgende importrichtlijn toe aan Notifications.m:

    #import <WindowsAzureMessaging/WindowsAzureMessaging.h>
    
  6. Kopieer de volgende code in de implementatiesectie van het bestand 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];
    }
    

    Deze klasse maakt gebruik van lokale opslag om de categorieën nieuws op te slaan en op te halen die dit apparaat ontvangt. Het bevat ook een methode om voor deze categorieën te registreren met behulp van een sjabloonregistratie .

  7. Voeg in het AppDelegate.h bestand een importinstructie toe voor Notifications.h en voeg een eigenschap toe voor een exemplaar van de Notifications klasse:

    #import "Notifications.h"
    
    @property (nonatomic) Notifications* notifications;
    
  8. Voeg in de didFinishLaunchingWithOptions methode in AppDelegate.mde code toe om het meldingsexemplaar aan het begin van de methode te initialiseren.
    HUBNAMEen HUBLISTENACCESS (gedefinieerd in hubinfo.h) moeten de <hub name> tijdelijke aanduidingen en <connection string with listen access> al zijn vervangen door de naam van uw Notification Hub en de connection string voor DefaultListenSharedAccessSignature die u eerder hebt verkregen

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

    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. Uw app kan dan worden geregistreerd voor meldingen, maar bestaande registraties kunnen niet worden gewijzigd, en er kunnen geen meldingen worden verzonden. De sleutel voor volledige toegang wordt gebruikt in een beveiligde back-endservice voor het verzenden van meldingen en het wijzigen van bestaande registraties.

  9. Vervang in de didRegisterForRemoteNotificationsWithDeviceToken methode in AppDelegate.mde code in de methode door de volgende code om het apparaattoken door te geven aan de notifications klasse. De notifications klasse voert de registratie voor meldingen met de categorieën uit. Als de gebruiker categorieselecties wijzigt, roept u de subscribeWithCategories methode aan als reactie op de knop Abonneren om deze bij te werken.

    Notitie

    Omdat het apparaattoken dat is toegewezen door de Apple Push Notification Service (APNS) op elk gewenst moment kan worden gewijzigd, moet u zich regelmatig registreren voor meldingen om fouten met meldingen te voorkomen. In dit voorbeeld wordt er elke keer dat de app wordt gestart een registratie voor meldingen vastgelegd. 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.

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

    Op dit moment mag er geen andere code in de didRegisterForRemoteNotificationsWithDeviceToken methode zijn.

  10. De volgende methoden moeten al aanwezig zijn in AppDelegate.m na het voltooien van de zelfstudie Aan de slag met Notification Hubs . Zo niet, voeg ze dan toe.

    - (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"]];
     }
    

    Deze methode verwerkt meldingen die worden ontvangen wanneer de app wordt uitgevoerd door een eenvoudige UIAlert weer te geven.

  11. Voeg in ViewController.meen import -instructie toe voor AppDelegate.h en kopieer de volgende code naar de XCode-gegenereerde subscribe methode. Met deze code wordt de registratie van de melding bijgewerkt om de nieuwe categorietags te gebruiken die de gebruiker heeft gekozen in de gebruikersinterface.

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

    Met deze methode wordt een NSMutableArray van categorieën gemaakt en wordt de Notifications klasse gebruikt om de lijst op te slaan in de lokale opslag en worden de bijbehorende tags geregistreerd bij uw Notification Hub. Wanneer categorieën worden gewijzigd, wordt de registratie opnieuw gemaakt met de nieuwe categorieën.

  12. Voeg ViewController.min de volgende code toe aan de viewDidLoad methode om de gebruikersinterface in te stellen op basis van de eerder opgeslagen categorieën.

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

De app kan nu een set categorieën opslaan in de lokale opslag van het apparaat dat wordt gebruikt om te registreren bij de Notification Hub wanneer de app wordt gestart. De gebruiker kan de selectie van categorieën tijdens runtime wijzigen en op de subscribe methode klikken om de registratie voor het apparaat bij te werken. Vervolgens werkt u de app bij om meldingen voor belangrijk nieuws rechtstreeks in de app zelf te verzenden.

(optioneel) Getagde meldingen verzenden

Als u geen toegang hebt tot Visual Studio, kunt u doorgaan naar de volgende sectie en meldingen verzenden vanuit de app zelf. U kunt ook de juiste sjabloonmelding verzenden vanaf de Azure Portal met behulp van het tabblad foutopsporing voor uw Notification Hub.

In deze sectie verzendt u het laatste nieuws als gelabelde sjabloonmeldingen vanuit een .NET-console-app.

  1. Maak in Visual Studio een nieuwe Visual C#-consoletoepassing:

    1. Selecteer in het menu Bestand>Nieuw>Project.
    2. Selecteer bij Een nieuw project maken de Consoletoepassing (.NET Framework) voor C# in de lijst met sjablonen en selecteer Volgende.
    3. voer een naam voor de app in.
    4. Bij Oplossing kiest u Aan oplossing toevoegen en selecteert u Maken om het project te maken.
  2. Selecteer Tools>NuGet Package Manager>Package Manager Console en voer vervolgens in het consolevenster de volgende opdracht uit:

    Install-Package Microsoft.Azure.NotificationHubs
    

    Met deze actie wordt een verwijzing toegevoegd aan de Azure Notification Hubs SDK met het Microsoft.Azure.NotificationHubs-pakket.

  3. Open het bestand Program.cs en voeg de volgende using-instructie toe:

    using Microsoft.Azure.NotificationHubs;
    
  4. Voeg in de klasse Program de volgende methode toe of vervang de methode als deze al bestaat:

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

    Met deze code wordt een sjabloonmelding verzonden voor elk van de zes labels in de tekenreeksmatrix. Het gebruik van labels zorgt ervoor dat apparaten meldingen ontvangen voor de geregistreerde categorieën.

  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.

  6. Voeg de volgende regels toe in de methode Main():

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

(optioneel) Meldingen verzenden vanaf het apparaat

Normaal gesproken worden meldingen verzonden door een back-endservice, maar u kunt meldingen over belangrijk nieuws rechtstreeks vanuit de app verzenden. Hiervoor werkt u de SendNotificationRESTAPI methode bij die u hebt gedefinieerd in de zelfstudie Aan de slag met Notification Hubs .

  1. Werk ViewController.min de SendNotificationRESTAPI methode als volgt bij, zodat een parameter voor de categorietag wordt geaccepteerd en de juiste sjabloonmelding wordt verzonden.

    - (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. Werk ViewController.min de Send Notification actie bij zoals wordt weergegeven in de volgende code. Zodat de meldingen met behulp van elke tag afzonderlijk worden verzonden en naar meerdere platforms worden verzonden.

    - (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. Bouw uw project opnieuw en zorg ervoor dat er geen buildfouten optreden.

De app uitvoeren en meldingen genereren

  1. Druk op de knop Uitvoeren om het project te bouwen en de app te starten. Selecteer enkele opties voor belangrijk nieuws waarop u zich wilt abonneren en druk vervolgens op de knop Abonneren . U ziet een dialoogvenster waarin wordt aangegeven dat de meldingen zijn geabonneerd.

    Voorbeeldmelding in iOS

    Wanneer u Abonneren kiest, converteert de app de geselecteerde categorieën naar tags en vraagt de app een nieuwe apparaatregistratie voor de geselecteerde tags aan via de Notification Hub.

  2. Voer een bericht in dat moet worden verzonden als belangrijk nieuws en druk vervolgens op de knop Melding verzenden . U kunt ook de .NET-console-app uitvoeren om meldingen te genereren.

    Meldingsvoorkeuren wijzigen in iOS

  3. Elk apparaat dat is geabonneerd op belangrijk nieuws ontvangt de belangrijke nieuwsmeldingen die u zojuist hebt verzonden.

Volgende stappen

In deze zelfstudie hebt u broadcastmeldingen verzonden naar specifieke iOS-apparaten die zijn geregistreerd voor de categorieën. Als u wilt weten hoe u gelokaliseerde meldingen pusht, gaat u verder met de volgende zelfstudie: