Öğretici: Azure Notification Hubs kullanarak belirli iOS cihazlarına anında iletme bildirimleri gönderme

Genel Bakış

Bu öğreticide, bir iOS uygulamasında son dakika haberleri yayınlamak için Azure Notification Hubs'ın nasıl kullanılacağı gösterilmektedir. Tamamlandığında, ilgilendiğiniz son dakika haberleri kategorilerine kaydolabilirsiniz ve yalnızca bu kategoriler için anında iletme bildirimleri alabilirsiniz. Bu senaryo, daha önce ilgisini belirtmiş kullanıcı gruplarına bildirim gönderilmesi gereken RSS okuyucu, müzik hayranlarına yönelik uygulamalar vb. birçok uygulama için ortak düzendir.

Yayın senaryoları, bildirim hub’ında bir kayıt oluştururken bir veya daha fazla etiket dahil edilerek etkinleştirilir. Bildirimler bir etikete gönderildiğinde, etiket için kaydolan cihazlar bildirimi alır. Etiketler basitçe birer dize olduğundan, önceden hazırlanması gerekmez. Etiketler hakkında daha fazla bilgi için bkz. Notification Hubs Yönlendirme ve Etiket İfadeleri.

Bu öğreticide, aşağıdaki adımları gerçekleştireceksiniz:

  • Uygulamaya kategori seçimi ekleme
  • Etiketli bildirimler gönderme
  • Cihazdan bildirim gönderme
  • Uygulamayı çalıştırma ve bildirimler oluşturma

Ön koşullar

Bu konu, Öğretici: Azure Notification Hubs kullanarak iOS uygulamalarına anında iletme bildirimleri gönderme bölümünde oluşturduğunuz uygulama üzerinde oluşturulmuştur. Bu öğreticiye başlamadan önce Öğretici: Azure Notification Hubs kullanarak iOS uygulamalarına anında iletme bildirimleri gönderme adımlarını tamamlamış olmanız gerekir.

Uygulamaya kategori seçimi ekleme

İlk adım, kullanıcının kaydolmak üzere kategorileri seçmesini sağlayan kullanıcı arabirimi öğelerini mevcut görsel şeridinize eklemektir. Bir kullanıcı tarafından seçilen kategoriler cihazda depolanır. Uygulama başlatıldığında, etiketler olarak seçilen kategorilerle bildirim hub’ınızda bir cihaz kaydı oluşturulur.

  1. MainStoryboard_iPhone.storyboard'unuza nesne kitaplığından aşağıdaki bileşenleri ekleyin:

    • "Son Dakika Haberleri" metnini içeren bir etiket,

    • "World", "Politics", "Business", "Technology", "Science", "Sports" kategori metinleri içeren etiketler,

    • Kategori başına bir tane olmak üzere altı anahtar, her anahtarın Durumunu varsayılan olarak Kapalı olarak ayarlar.

    • "Abone ol" etiketli bir düğme

      Görsel taslak aşağıdaki gibi görünmelidir:

      Xcode arabirim oluşturucusu

  2. Yardımcı editörde, tüm anahtarlar için çıkışlar oluşturun ve bunlara "WorldSwitch", "PoliticsSwitch", "BusinessSwitch", "TechnologySwitch", "ScienceSwitch", "SportsSwitch" adını verin

  3. Düğmeniz için adlı subscribebir Eylem oluşturun; aşağıdaki ViewController.h kodu içermelidir:

    @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. adlı Notificationsyeni bir Cocoa Touch Sınıfı oluşturun. Notifications.h dosyasının arabirim bölümünde aşağıdaki kodu kopyalayın:

    @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. Notifications.m'ye aşağıdaki içeri aktarma yönergesini ekleyin:

    #import <WindowsAzureMessaging/WindowsAzureMessaging.h>
    
  6. Notifications.m dosyasının uygulama bölümünde aşağıdaki kodu kopyalayın.

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

    Bu sınıf, bu cihazın aldığı haber kategorilerini depolamak ve almak için yerel depolamayı kullanır. Ayrıca, şablon kaydı kullanarak bu kategorilere kaydolmak için bir yöntem içerir.

  7. AppDelegate.h dosyasında için bir içeri aktarma deyimi Notifications.h ekleyin ve sınıfının bir örneği Notifications için bir özellik ekleyin:

    #import "Notifications.h"
    
    @property (nonatomic) Notifications* notifications;
    
  8. didFinishLaunchingWithOptions içindeki yöntemindeAppDelegate.m, yönteminin başındaki notifications örneğini başlatmak için kodu ekleyin.
    HUBNAMEve HUBLISTENACCESS (içinde hubinfo.htanımlanmıştır), ve <connection string with listen access> yer tutucularının yerine <hub name> daha önce edindiğiniz DefaultListenSharedAccessSignature bağlantı dizesinin bildirim hub'ı adınızla değiştirilmiş olması gerekir

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

    Not

    Bir istemci uygulaması ile dağıtılmış kimlik bilgileri genellikle güvenli olmadığından yalnızca istemci uygulamanızla dinleme erişimi için anahtarı dağıtmanız gerekir. Dinleme erişimi, uygulamanızın bildirimlere kaydolmasını sağlar, ancak mevcut kayıtlar değiştirilemez ve bildirimler gönderilemez. Tam erişim anahtarı, güvenli bir arka uç hizmetinde bildirimler göndermek ve mevcut kayıtları değiştirmek için kullanılır.

  9. didRegisterForRemoteNotificationsWithDeviceToken içindeki yöntemindeAppDelegate.m, yöntemindeki kodu aşağıdaki kodla değiştirerek cihaz belirtecini sınıfına notifications geçirin. notifications sınıfı, kategorilerle bildirimlere kaydolma işlemini gerçekleştirir. Kullanıcı kategori seçimlerini değiştirirse, abone ol düğmesine yanıt olarak yöntemini çağırarak subscribeWithCategories bunları güncelleştirin.

    Not

    Apple Anında İletilen Bildirim Hizmeti (APNS) tarafından atanan cihaz belirteci istediğiniz zaman değişebileceğinden, bildirim hatalarını önlemek için bildirimlere sık sık kaydolmanız gerekir. Bu örnek, uygulama her başlatıldığında bildirimlere kaydolur. Sık sık çalıştırılan uygulamalar için, önceki kayıttan bu yana bir günden az zaman geçtiyse bant genişliğini korumak için günde birkaç kere kaydı atlayabilirsiniz.

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

    Bu noktada yönteminde didRegisterForRemoteNotificationsWithDeviceToken başka kod olmamalıdır.

  10. Notification Hubs'ı kullanmaya başlama öğreticisi tamamladıktan sonra aşağıdaki yöntemlerin zaten mevcut AppDelegate.m olması gerekir. Aksi takdirde, bunları ekleyin.

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

    Bu yöntem, uygulama çalışırken alınan bildirimleri basit bir UIAlert görüntüleyerek işler.

  11. içinde ViewController.miçin AppDelegate.h bir import deyim ekleyin ve aşağıdaki kodu XCode tarafından oluşturulan subscribe yönteme kopyalayın. Bu kod, bildirim kaydını kullanıcının kullanıcı arabiriminde seçtiği yeni kategori etiketlerini kullanacak şekilde güncelleştirir.

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

    Bu yöntem kategorilerden birini NSMutableArray oluşturur ve listeyi yerel depolama alanında depolamak için sınıfını kullanır Notifications ve ilgili etiketleri bildirim hub'ınıza kaydeder. Kategoriler değiştirildiğinde kayıt yeni kategorilerle yeniden oluşturulur.

  12. içinde ViewController.m, kullanıcı arabirimini viewDidLoad önceden kaydedilmiş kategorilere göre ayarlamak için yöntemine aşağıdaki kodu ekleyin.

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

Uygulama artık uygulama her başlatıldığında bildirim hub'ına kaydolmak için kullanılan cihaz yerel depolama alanında bir kategori kümesi depolayabilir. Kullanıcı çalışma zamanında kategori seçimini değiştirebilir ve cihaz kaydını güncelleştirmek için yöntemine tıklayabilir subscribe . Ardından, son dakika haber bildirimlerini doğrudan uygulamanın kendisinde göndermek için uygulamayı güncelleştirirsiniz.

(isteğe bağlı) Etiketli bildirimler gönderme

Visual Studio'ya erişiminiz yoksa sonraki bölüme atlayabilir ve uygulamanın kendisinden bildirim gönderebilirsiniz. Ayrıca, bildirim hub'ınızın hata ayıklama sekmesini kullanarak Azure portal doğru şablon bildirimini de gönderebilirsiniz.

Bu bölümde, son dakika haberlerini .NET konsol uygulamasından etiketli şablon bildirimleri olarak yollarsınız.

  1. Visual Studio'da yeni bir Visual C# konsol uygulaması oluşturun:

    1. MenüdeDosya Yeni Proje'yi>seçin>.
    2. Yeni proje oluştur bölümünde şablon listesindeN C# için Konsol Uygulaması (.NET Framework) öğesini ve ardından İleri'yi seçin.
    3. Uygulama için bir ad girin.
    4. Çözüm için Çözüme ekle'yi seçin ve oluştur'u seçerek projeyi oluşturun.
  2. Araçlar>NuGet Paket Yöneticisi Paket Yöneticisi>Konsolu'nu seçin ve konsol penceresinde aşağıdaki komutu çalıştırın:

    Install-Package Microsoft.Azure.NotificationHubs
    

    Bu eylem , Microsoft.Azure.NotificationHubs paketini kullanarak Azure Notification Hubs SDK'sına bir başvuru ekler.

  3. Program.cs dosyasını açın ve aşağıdaki using deyimi ekleyin:

    using Microsoft.Azure.NotificationHubs;
    
  4. Program sınıfında, aşağıdaki yöntemi ekleyin veya zaten mevcutsa değiştirin:

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

    Bu kod, dize dizisindeki altı etiketin her biri için bir şablon bildirimi gönderir. Etiketlerin kullanılması, cihazların yalnızca kayıtlı kategoriler için bildirim almasını sağlar.

  5. Önceki kodda, <hub name> ve <connection string with full access> yer tutucularını bildirim hub'ı adınız ve bildirim hub’ınızın panosundaki DefaultFullSharedAccessSignature bağlantı dizeniz ile değiştirin.

  6. yöntemine Main() aşağıdaki satırları ekleyin:

     SendTemplateNotificationAsync();
     Console.ReadLine();
    
  7. Konsol uygulamasını oluşturun.

(isteğe bağlı) Cihazdan bildirim gönderme

Normalde bildirimler bir arka uç hizmeti tarafından gönderilir ancak son dakika haberlerini doğrudan uygulamadan gönderebilirsiniz. Bunu yapmak için Notification Hubs'ı kullanmaya başlama öğreticisinde tanımladığınız yöntemi güncelleştirinSendNotificationRESTAPI.

  1. içinde ViewController.m, yöntemini aşağıdaki gibi güncelleştirerek SendNotificationRESTAPI kategori etiketi için bir parametre kabul eder ve uygun şablon bildirimini gönderir.

    - (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. içinde ViewController.m, eylemi aşağıdaki Send Notification kodda gösterildiği gibi güncelleştirin. Böylece her etiketi kullanarak bildirimleri tek tek gönderir ve birden çok platforma gönderir.

    - (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. Projenizi yeniden derleyin ve derleme hatası olmadığından emin olun.

Uygulamayı çalıştırma ve bildirimler oluşturma

  1. Projeyi oluşturmak ve uygulamayı başlatmak için Çalıştır düğmesine basın. Abone olmak için bazı son dakika haberleri seçeneklerini belirleyin ve abone ol düğmesine basın. Bildirimlerin abone olduğunu belirten bir iletişim kutusu görmeniz gerekir.

    iOS'ta örnek bildirim

    Abone Ol'u seçtiğinizde uygulama seçili kategorileri etiketlere dönüştürür ve bildirim hub'ından seçili etiketler için yeni bir cihaz kaydı isteğinde bulunur.

  2. Son dakika haberleri olarak gönderilecek iletiyi girin ve Bildirim Gönder düğmesine basın. Alternatif olarak, bildirim oluşturmak için .NET konsol uygulamasını çalıştırın.

    iOS'ta bildirim tercihlerini değiştirme

  3. Son dakika haberlerine abone olan her cihaz, az önce gönderdiğiniz son dakika haber bildirimlerini alır.

Sonraki adımlar

Bu öğreticide, kategoriler için kaydolan belirli iOS cihazlarına yayın bildirimleri gönderdiniz. Yerelleştirilmiş bildirimleri göndermeyi öğrenmek için aşağıdaki öğreticiye ilerleyin: