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 lehet az Azure Notification Hubs használatával friss híreket küldeni egy iOS-alkalmazásba. Ha elkészült, regisztrálhat az Önt érdeklő legfrissebb 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 kapják meg 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, amely lehetővé teszi 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 kikapcsolva .

    • Egy gomb "Feliratkozás" címkével

      A storyboardnak a következőképpen kell kinéznie:

      Xcode interface builder

  2. Az asszisztensszerkesztő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 gombhoz , amelynek subscribea következő kódot kell tartalmaznia ViewController.h :

    @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 .Notifications Másolja ki a következő kódot a Notifications.h fájl felületi szakaszá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 az alábbi kódot az Notifications.m fájl implementációs 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 egy sablonregisztráció használatával is regisztrálhat ezekre a kategóriákra.

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

    #import "Notifications.h"
    
    @property (nonatomic) Notifications* notifications;
    
  8. didFinishLaunchingWithOptions A metódusban AppDelegate.madja hozzá azt a kódot, amely a metódus elején inicializálja az értesítési példányt.
    HUBNAME és HUBLISTENACCESS (a hubinfo.hdefiniált ) már az <hub name> értesítési központ nevére és <connection string with listen access> a defaultListenSharedAccessSignature kapcsolati sztringjére cseréli a korábban beszerzett helyőrzőket és helyőrzőket

    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 az alábbi kódra az eszköz jogkivonatának az notifications osztálynak való átadásához. 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 subscribeWithCategories metódust a feliratkozás gombra válaszul, hogy frissítse őket.

    Megjegyzés

    Mivel az Apple Push Notification Service (APNS) által hozzárendelt eszközjogkivonat 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 befejezésétől kezdve 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. Ebben ViewController.madjon hozzá egy utasítást AppDelegate.himport, és másolja az alábbi 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 az 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 ViewController.mmetódusban adja hozzá a következő kódot a viewDidLoad felhasználói felület beállításához a korábban mentett kategóriák alapjá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;
    

Az alkalmazás mostantól tárolhat kategóriákat az eszköz helyi tárolójában, amelyet az alkalmazás indításakor az értesítési központban való regisztrációhoz használnak. A felhasználó futásidőben módosíthatja a kategóriák kiválasztását, é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 az Azure Portalról 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> projekt fá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. Megoldás esetén 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-csomagkezelő>csomagkezelő konzolját , majd a konzolablakban futtassa a következő parancsot:

    Install-Package Microsoft.Azure.NotificationHubs
    

    Ez a művelet hozzáad egy hivatkozást 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 meghatározott módszert.

  1. Ebben 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. Ebben ViewController.mfrissítse a műveletet az Send Notification alábbi kódban látható módon. Így az egyes címkéket használó értesítéseket külön-külön küldi el, é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 feliratkozni szeretne, majd nyomja le a Feliratkozás gombot. Ekkor megjelenik egy párbeszédpanel, amely jelzi, hogy az értesítések elő lettek fizetve.

    Example notification on iOS

    Ha 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írké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 az értesítések létrehozásához.

    Change notification preferences in iOS

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

Következő lépések

Ebben az oktatóanyagban szórásos é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ének megismeréséhez lépjen tovább a következő oktatóanyagra: