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.
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:
Maak in de assistenteditor stopcontacten voor alle switches en noem ze 'WorldSwitch', 'PoliticsSwitch', 'BusinessSwitch', 'TechnologySwitch', 'ScienceSwitch', 'SportsSwitch'
Maak een actie voor de knop met de naam
subscribe
. uwViewController.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;
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;
Voeg de volgende importrichtlijn toe aan Notifications.m:
#import <WindowsAzureMessaging/WindowsAzureMessaging.h>
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 .
Voeg in het
AppDelegate.h
bestand een importinstructie toe voorNotifications.h
en voeg een eigenschap toe voor een exemplaar van deNotifications
klasse:#import "Notifications.h" @property (nonatomic) Notifications* notifications;
Voeg in de
didFinishLaunchingWithOptions
methode inAppDelegate.m
de code toe om het meldingsexemplaar aan het begin van de methode te initialiseren.
HUBNAME
enHUBLISTENACCESS
(gedefinieerd inhubinfo.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 verkregenself.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.
Vervang in de
didRegisterForRemoteNotificationsWithDeviceToken
methode inAppDelegate.m
de code in de methode door de volgende code om het apparaattoken door te geven aan denotifications
klasse. Denotifications
klasse voert de registratie voor meldingen met de categorieën uit. Als de gebruiker categorieselecties wijzigt, roept u desubscribeWithCategories
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.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.
Voeg in
ViewController.m
eenimport
-instructie toe voorAppDelegate.h
en kopieer de volgende code naar de XCode-gegenereerdesubscribe
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 deNotifications
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.Voeg
ViewController.m
in de volgende code toe aan deviewDidLoad
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.
Maak in Visual Studio een nieuwe Visual C#-consoletoepassing:
- Selecteer in het menu Bestand>Nieuw>Project.
- Selecteer bij Een nieuw project maken de Consoletoepassing (.NET Framework) voor C# in de lijst met sjablonen en selecteer Volgende.
- voer een naam voor de app in.
- Bij Oplossing kiest u Aan oplossing toevoegen en selecteert u Maken om het project te maken.
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.
Open het bestand Program.cs en voeg de volgende
using
-instructie toe:using Microsoft.Azure.NotificationHubs;
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.
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.Voeg de volgende regels toe in de methode
Main()
:SendTemplateNotificationAsync(); Console.ReadLine();
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 .
Werk
ViewController.m
in deSendNotificationRESTAPI
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]; }
Werk
ViewController.m
in deSend 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]; } }
Bouw uw project opnieuw en zorg ervoor dat er geen buildfouten optreden.
De app uitvoeren en meldingen genereren
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.
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.
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.
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: