Oktatóanyag: Leküldéses értesítések küldése adott iOS-eszközökre az Azure Notification Hubs használatával

Áttekintés

Ez az oktatóanyag bemutatja, hogyan használhatja az Azure Notification Hubsot a legfrissebb hírek iOS-alkalmazásokba való közvetítésére. Ha elkészült, regisztrálhat az önt érdeklő hírkategóriákra, és csak leküldéses értesítéseket kaphat ezekről a kategóriákról. Ezt a forgatókönyvet gyakran használják olyan alkalmazásokban, ahol az értesítéseket egy adott téma iránt korábban érdeklődő felhasználók csoportjainak kell elküldeni. Ilyen lehet például egy RSS-olvasó, a zenerajongóknak készült alkalmazások stb.

A közvetítési forgatókönyveket úgy lehet engedélyezni, ha az értesítési központban a regisztráció létrehozásakor hozzáad egy vagy több címkét. Ha a rendszer értesítéseket küld egy címkének, a címkére regisztrált eszközök megkapják az értesítést. A címkék egyszerű sztringek, nem szükséges őket előzetesen kiosztani. További információ a címkékről: Útválasztás és címkekifejezések az értesítési központokban.

Ebben az oktatóanyagban a következő lépéseket hajtja végre:

  • Kategóriakijelölés hozzáadása az alkalmazáshoz
  • Címkézett értesítések küldése
  • Értesítések küldése az eszközről
  • Az alkalmazás futtatása és értesítések létrehozása

Előfeltételek

Ez a témakör az oktatóanyagban létrehozott alkalmazásra épül : Leküldéses értesítések küldése iOS-alkalmazásokba az Azure Notification Hubs használatával. Az oktatóanyag megkezdése előtt már el kell végeznie az oktatóanyagot: Leküldéses értesítések küldése iOS-alkalmazásokba az Azure Notification Hubs használatával.

Kategóriaválasztó hozzáadása az alkalmazáshoz

Az első lépés az, hogy hozzáadja a felhasználói felület elemeit a meglévő storyboardhoz, amelyek lehetővé teszik a felhasználó számára, hogy kategóriákat válasszon a regisztrációhoz. A felhasználó által kiválasztott kategóriákat az eszköz tárolja. Az alkalmazás indításakor egy eszközregisztráció jön létre az értesítési központban, amely címkeként tartalmazza a választott kategóriákat.

  1. A MainStoryboard_iPhone.storyboardban adja hozzá a következő összetevőket az objektumtárból:

    • "Breaking News" szöveggel ellátott címke,

    • Címkék kategóriaszövegekkel: "World", "Politics", "Business", "Technology", "Science", "Sports",

    • Kategóriánként hat kapcsoló állítja be az egyes kapcsolók állapotát alapértelmezés szerint Ki értékre.

    • Egy "Feliratkozás" feliratú gomb

      A történetnek a következőképpen kell kinéznie:

      Xcode felületszerkesztő

  2. A segédszerkesztőben hozzon létre üzleteket az összes kapcsolóhoz, és hívja őket "WorldSwitch", "PoliticsSwitch", "BusinessSwitch", "TechnologySwitch", "ScienceSwitch", "SportsSwitch"

  3. Hozzon létre egy műveletet a nevű subscribegombhoz; a ViewController.h következő kódot kell tartalmaznia:

    @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. Hozzon létre egy új Cocoa Touch Osztályt nevű Notifications. Másolja ki a következő kódot az Notifications.h fájl felületszakaszában:

    @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. Adja hozzá a következő importálási irányelvet az Notifications.m fájlhoz:

    #import <WindowsAzureMessaging/WindowsAzureMessaging.h>
    
  6. Másolja ki a következő kódot az Notifications.m fájl implementálási szakaszában.

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

    Ez az osztály helyi tárolót használ az eszköz által kapott hírek kategóriáinak tárolására és lekérésére. Emellett tartalmaz egy metódust is, amely sablonregisztrációval regisztrálja ezeket a kategóriákat.

  7. A fájlban AppDelegate.h adjon hozzá egy importálási utasítást a osztály egy példányáhozNotifications.h, és adjon hozzá egy tulajdonságot:Notifications

    #import "Notifications.h"
    
    @property (nonatomic) Notifications* notifications;
    
  8. didFinishLaunchingWithOptions A metódusban AppDelegate.madja hozzá a kódot az értesítési példány inicializálásához a metódus elején.
    HUBNAMEés HUBLISTENACCESS (definiálva) hubinfo.hmár a és <connection string with listen access> a <hub name> helyőrzőket az értesítési központ nevére és a korábban beszerzett DefaultListenSharedAccessSignature kapcsolati sztring kell cserélnie.

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

    Megjegyzés

    Mivel az ügyfélalkalmazással terjesztett hitelesítő adatok általában nem biztonságosak, csak a figyelési hozzáférés kulcsát terjessze az ügyfélalkalmazással. A figyelési hozzáférés lehetővé teszi, hogy az alkalmazás regisztráljon értesítésekre, a meglévő regisztrációkat azonban nem lehet módosítani, és értesítéseket sem lehet küldeni. A teljes körű hozzáférési kulcsot egy biztonságos háttérszolgáltatásban használja a rendszer értesítések kiküldésére és a meglévő regisztrációk módosítására.

  9. didRegisterForRemoteNotificationsWithDeviceToken A metódusban AppDelegate.mcserélje le a metódusban lévő kódot a következő kódra, hogy átadja az eszköz jogkivonatát az notifications osztálynak. Az notifications osztály elvégzi a kategóriákkal kapcsolatos értesítések regisztrálását. Ha a felhasználó módosítja a kategóriakijelöléseket, hívja meg a metódust a subscribeWithCategoriesfeliratkozás gombra válaszul, hogy frissítse őket.

    Megjegyzés

    Mivel az Apple Push Notification Service (APNS) által hozzárendelt eszköz token bármikor változhat, az értesítési hibák elkerülése érdekében gyakran kell regisztrálnia az értesítésekre. Ebben a példában a rendszer az alkalmazás minden egyes indításakor regisztrál az értesítésekre. A gyakran, naponta egynél többször futtatott alkalmazások esetén a sávszélesség megőrzése érdekében akár ki is hagyhatja a regisztrációt, ha kevesebb mint egy nap telt el az előző regisztráció óta.

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

    Ezen a ponton nem lehet más kód a didRegisterForRemoteNotificationsWithDeviceToken metódusban.

  10. A Notification Hubs használatának első lépéseit ismertető oktatóanyag elvégzése után az alábbi módszereknek már jelen AppDelegate.m kell lenniük. Ha nem, adja hozzá őket.

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

    Ez a metódus egy egyszerű UIAlert megjelenítésével kezeli az alkalmazás futtatásakor kapott értesítéseket.

  11. A fájlban ViewController.madjon hozzá egy utasítást import , AppDelegate.h és másolja a következő kódot az XCode által létrehozott subscribe metódusba. Ez a kód frissíti az értesítési regisztrációt, hogy a felhasználó által a felhasználói felületen kiválasztott új kategóriacímkéket használja.

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

    Ez a metódus kategóriákat NSMutableArray hoz létre, és a Notifications osztály használatával tárolja a listát a helyi tárolóban, és regisztrálja a megfelelő címkéket az értesítési központban. A kategóriák módosításakor a rendszer újra létrehozza a regisztrációt az új kategóriákkal.

  12. A fájlban ViewController.madja hozzá a következő kódot a viewDidLoad metódushoz, hogy a korábban mentett kategóriák alapján állítsa be a felhasználói felületet.

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

Az alkalmazás mostantól tárolhat kategóriákat az eszköz helyi tárolójában, amellyel regisztrálhat az értesítési központban, amikor az alkalmazás elindul. A felhasználó módosíthatja a kategóriák kiválasztását futásidőben, és a subscribe metódusra kattintva frissítheti az eszköz regisztrációját. Ezután frissíti az alkalmazást, hogy közvetlenül az alkalmazásban küldje el a legfrissebb híreket.

(nem kötelező) Címkézett értesítések küldése

Ha nincs hozzáférése a Visual Studióhoz, ugorjon a következő szakaszra, és küldjön értesítéseket magáról az alkalmazásról. A megfelelő sablonértesítést a Azure Portal is elküldheti az értesítési központ hibakeresési lapján.

Ebben a szakaszban a legfrissebb híreket címkézett sablonértesítésekként fogja elküldeni egy .NET-konzolalkalmazásból.

  1. A Visual Studióban hozzon létre egy új Visual C#-konzolalkalmazást:

    1. A menüben válassza azÚj>projektfájlja> lehetőséget.
    2. Az Új projekt létrehozása területen válassza a C# konzolalkalmazását (.NET-keretrendszer) a sablonok listájában, majd válassza a Tovább gombot.
    3. Adja meg az alkalmazás nevét.
    4. A Megoldásbeállításnál válassza a Hozzáadás a megoldáshoz lehetőséget, majd válassza a Létrehozás lehetőséget a projekt létrehozásához.
  2. Válassza az Eszközök>NuGet Package Manager Csomagkezelő>konzol lehetőséget, majd a konzolablakban futtassa a következő parancsot:

    Install-Package Microsoft.Azure.NotificationHubs
    

    Ez a művelet egy hivatkozást ad hozzá az Azure Notification Hubs SDK-hoz a Microsoft.Azure.NotificationHubs csomag használatával.

  3. Nyissa meg a Program.cs fájlt, és adja hozzá a következő using utasítást:

    using Microsoft.Azure.NotificationHubs;
    
  4. A Program osztályban adja hozzá a következő metódust, vagy ha már létezik, cserélje le azt a következőre:

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

    Ez a kód sablonértesítéseket küld a sztringtömb mind a hat címkéjének. A címkék használatával biztosítható, hogy az eszközök csak a regisztrált kategóriákhoz tartozó értesítéseket fogadják.

  5. A <hub name> és a <connection string with full access> helyőrzőket cserélje le a fenti kódban az értesítési központ nevére és a DefaultFullSharedAccessSignature az értesítési központ irányítópultjáról származó kapcsolati sztringjére.

  6. A metódusban Main() adja hozzá a következő sorokat:

     SendTemplateNotificationAsync();
     Console.ReadLine();
    
  7. Hozza létre a konzolalkalmazást.

(nem kötelező) Értesítések küldése az eszközről

Az értesítéseket általában egy háttérszolgáltatás küldi el, de közvetlenül az alkalmazásból küldhet friss híreket. Ehhez frissítenie kell a SendNotificationRESTAPINotification Hubs használatának első lépései oktatóanyagban definiált metódust.

  1. A fájlban ViewController.mfrissítse a metódust az SendNotificationRESTAPI alábbiak szerint, hogy elfogadja a kategóriacímke paraméterét, és elküldi a megfelelő sablonértesítést.

    - (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. A fájlban ViewController.mfrissítse a Send Notification műveletet a következő kódban látható módon. Így az értesítéseket egyenként küldi el az egyes címkék használatával, és több platformra küldi.

    - (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. Építse újra a projektet, és győződjön meg arról, hogy nincsenek buildelési hibák.

Az alkalmazás futtatása és értesítések létrehozása

  1. Nyomja le a Run (Futtatás) gombot a projekt felépítéséhez és az alkalmazás elindításához. Válassza ki a legfrissebb híreket, amelyekre feliratkozhat, majd nyomja le a Feliratkozás gombot. Meg kell jelennie egy párbeszédpanelnek, amely jelzi, hogy az értesítések elő lettek fizetve.

    Példaértesítés iOS rendszeren

    Amikor a Feliratkozás lehetőséget választja, az alkalmazás címkékké alakítja a kijelölt kategóriákat, és új eszközregisztrációt kér a kijelölt címkékhez az értesítési központból.

  2. Írjon be egy üzenetet, amelyet friss hírekként szeretne elküldeni, majd nyomja le az Értesítés küldése gombot. Másik lehetőségként futtassa a .NET-konzolalkalmazást értesítések létrehozásához.

    Értesítési beállítások módosítása iOS rendszerben

  3. A legfrissebb hírekre előfizetett összes eszköz megkapja az imént küldött friss híreket.

Következő lépések

Ebben az oktatóanyagban közvetítési értesítéseket küldött bizonyos, a kategóriákhoz regisztrált iOS-eszközökre. A honosított értesítések leküldéséről az alábbi oktatóanyagban tájékozódhat: