Zelfstudie: Pushmeldingen verzenden naar specifieke iOS-apparaten met behulp van Azure Notification Hubs
Overzicht
In deze zelfstudie leert u hoe u Met Azure Notification Hubs nieuwsmeldingen kunt uitzenden naar een iOS-app. Als u klaar bent, kunt u zich registreren voor nieuwscategorieën waarin u geïnteresseerd bent en ontvangt u alleen pushmeldingen voor deze categorieën. Dit scenario is een algemeen patroon voor veel apps waarbij meldingen moeten worden verzonden naar groepen gebruikers die eerder interesse hebben aangegeven, bijvoorbeeld RSS-lezer, apps voor muziekfans, enzovoort.
Broadcastscenario's worden ingeschakeld door een of meer -tags wanneer een registratie wordt gemaakt in de Notification Hub. Wanneer meldingen naar een tag worden verzonden, ontvangen apparaten die zich hebben geregistreerd voor de tag de melding. Omdat tags gewoon tekenreeksen zijn, hoeven ze niet van tevoren te worden ingericht. Zie Notification Hubs Routing and Tag Expressionsvoor 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
Vereiste voorwaarden
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 al hebben voltooid: Pushmeldingen verzenden naar iOS-apps met behulp van Azure Notification Hubs.
Selectie van categorieën toevoegen aan de app
De eerste stap is het toevoegen van de gebruikersinterface-elementen aan uw bestaande storyboard waarmee de gebruiker categorieën kan selecteren die moeten worden geregistreerd. De categorieën die door een gebruiker zijn geselecteerd, worden opgeslagen op het apparaat. Wanneer de app wordt gestart, wordt er een apparaatregistratie gemaakt in uw Notification Hub 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 'Belangrijk nieuws',
Labels met categorieteksten "Wereld", "Politiek", "Zakelijk", "Technologie", "Wetenschap", "Sport",
Zes schakelaars, één per categorie, stellen standaard elk van de schakelaars in op State om Uit te zijn.
Eén knop met het label Abonneren
Uw storyboard moet er als volgt uitzien:
Maak in de assistent-editor stopcontacten voor alle switches en noem ze 'WorldSwitch', 'PoliticsSwitch', 'BusinessSwitch', 'TechnologySwitch', 'ScienceSwitch', 'SportsSwitch'
Maak een actie voor uw 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 Class genaamd
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 voor het registreren voor deze categorieën met behulp van een Sjabloon registratie.
Voeg in het bestand
AppDelegate.h
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 methode
didFinishLaunchingWithOptions
binnenAppDelegate.m
de code toe om de notificatie-instantie aan het begin van de methode te initialiseren.
HUBNAME
enHUBLISTENACCESS
(zoals gedefinieerd inhubinfo.h
) moeten al de tijdelijke aanduidingen<hub name>
en<connection string with listen access>
vervangen hebben door de naam van uw Notification Hub en de verbindingsreeks 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 over het algemeen niet veilig zijn, moet u de sleutel alleen distribueren voor luistertoegang met uw client-app. Met listen-toegang kan uw app zich registreren voor meldingen, maar bestaande registraties kunnen niet worden gewijzigd en meldingen kunnen niet worden verzonden. De volledige toegangssleutel wordt gebruikt in een beveiligde back-endservice voor het verzenden van meldingen en het wijzigen van bestaande registraties.
Vervang in de methode
didRegisterForRemoteNotificationsWithDeviceToken
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 meldingsfouten te voorkomen. In dit voorbeeld registreert de app zich elke keer dat deze wordt gestart voor meldingen. Voor apps die regelmatig worden uitgevoerd, kunt u de registratie waarschijnlijk overslaan om bandbreedte te behouden 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 methode
didRegisterForRemoteNotificationsWithDeviceToken
zijn.De volgende methoden moeten al aanwezig zijn in
AppDelegate.m
nadat je de Aan de slag met Notification Hubs tutorial hebt voltooid. Zo niet, voeg ze 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 voorAppDelegate.h
toe en kopieer de volgende code naar de door XCode gegenereerdesubscribe
methode. Met deze code wordt de registratie van meldingen bijgewerkt voor het gebruik van de nieuwe categorietags 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 maakt u een
NSMutableArray
aan categorieën en gebruikt u deNotifications
-klasse om de lijst op te slaan in de lokale opslag, waarbij u de bijbehorende tags registreert bij uw Notification Hub. Wanneer categorieën worden gewijzigd, wordt de registratie opnieuw gemaakt met de nieuwe categorieën.Voeg in
ViewController.m
de volgende code toe in de methodeviewDidLoad
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 die wordt gebruikt voor registratie 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 de 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 vanuit de Azure-portal met behulp van het tabblad foutopsporing voor uw Notification Hub.
In deze sectie verzendt u belangrijk nieuws als getagde sjabloonmeldingen van een .NET-console-app.
Maak in Visual Studio een nieuwe Visual C#-consoletoepassing:
- Selecteer in het menu Bestand>Nieuw>Project.
- Selecteer in Een nieuw project makenConsole-app (.NET Framework) voor C# in de lijst met sjablonen en selecteer Volgende.
- Voer een naam voor de app in.
- Voor Solutionkiest u Toevoegen aan oplossingen 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 naar de Azure Notification Hubs SDK met behulp van het Microsoft.Azure.NotificationHubs-pakket.
Open het Program.cs-bestand en voeg de volgende
using
-instructie toe:using Microsoft.Azure.NotificationHubs;
Voeg in de klasse
Program
de volgende methode toe of vervang deze 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 tags in de tekenreeksmatrix. Het gebruik van tags zorgt ervoor dat apparaten alleen 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 uw Notification Hub en de verbindingsreeks voor DefaultFullSharedAccessSignature van het dashboard van uw Notification Hub.Voeg in de methode
Main()
de volgende regels toe: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 voor belangrijk nieuws rechtstreeks vanuit de app verzenden. Hiervoor werkt u de SendNotificationRESTAPI
methode bij die u hebt gedefinieerd in de Aan de slag met Notification Hubs zelfstudie.
Werk in
ViewController.m
deSendNotificationRESTAPI
methode als volgt bij zodat deze een parameter voor de categorietag accepteert en de juiste sjabloon melding verzendt.- (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 in
ViewController.m
de actieSend Notification
bij, zoals wordt weergegeven in de volgende code. Zodat de meldingen met 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 zijn.
De app uitvoeren en meldingen genereren
Druk op de knop Uitvoeren om het project te bouwen en de app te starten. Selecteer enkele belangrijke nieuwsopties waarop u zich wilt abonneren en druk vervolgens op de knop Abonneren. Er wordt een dialoogvenster weergegeven waarin staat dat u zich op de meldingen heeft geabonneerd.
Wanneer u Abonnerenkiest, converteert de app de geselecteerde categorieën naar tags en vraagt de app een nieuwe apparaatregistratie aan voor de geselecteerde tags vanuit 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 meldingen die u zojuist hebt verzonden.
Volgende stappen
In deze handleiding heeft u broadcastmeldingen verzonden naar specifieke iOS-apparaten die zijn geregistreerd voor de categorieën. Ga naar de volgende zelfstudie voor meer informatie over het pushen van gelokaliseerde meldingen: