Öğretici: Azure Notification Hubs kullanarak iOS'a yerelleştirilmiş anında iletme bildirimleri gönderme

Bu öğreticide, dil ve cihaz tarafından yerelleştirilmiş son dakika haber bildirimlerini yayınlamak için Azure Notification Hubs'ın şablonlar özelliğinin nasıl kullanılacağı gösterilmektedir. Bu öğreticide, son dakika haberleri göndermek için Notification Hubs'ı kullanma bölümünde oluşturulan iOS uygulamasıyla başlayacaksınız. Tamamlandığında, ilgilendiğiniz kategorilere kaydolabilir, bildirimlerin alınabileceği bir dil belirtebilir ve yalnızca o dildeki seçili kategoriler için anında iletme bildirimleri alabilirsiniz.

Bu senaryo iki bölümden oluşur:

  • iOS uygulaması, istemci cihazların bir dil belirtmesine ve farklı son dakika haber kategorilerine abone olmasına olanak tanır;
  • Arka uç, Azure Notification Hubs'ın etiket ve şablon özelliklerini kullanarak bildirimleri yayınlar.

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

  • Uygulama kullanıcı arabirimini güncelleştirme
  • iOS uygulamasını derleme
  • .NET konsol uygulamasından yerelleştirilmiş şablon bildirimleri gönderme
  • Cihazdan yerelleştirilmiş şablon bildirimleri gönderme

Genel Bakış

Son dakika haberleri göndermek için Notification Hubs'ı kullanma bölümünde, farklı haber kategorilerine yönelik bildirimlere abone olmak için etiketleri kullanan bir uygulama oluşturacaksınız. Ancak birçok uygulama birden çok pazarı hedefler ve yerelleştirme gerektirir. Bu, bildirimlerin içeriğinin yerelleştirilmesi ve doğru cihaz kümesine teslim edilmesi gerektiğini gösterir. Bu öğreticide, yerelleştirilmiş son dakika haber bildirimlerini kolayca sunmak için Notification Hubs'ın şablon özelliğini nasıl kullanacağınız gösterilmektedir.

Not

Yerelleştirilmiş bildirimler göndermenin bir yolu, her etiketin birden çok sürümünü oluşturmaktır. Örneğin İngilizce, Fransızca ve Mandarin'i desteklemek için dünya haberleri için üç farklı etikete ihtiyacınız vardır: "world_en", "world_fr" ve "world_ch". Daha sonra bu etiketlerin her birine dünya haberlerinin yerelleştirilmiş bir sürümünü göndermeniz gerekir. Bu konuda, etiketlerin çoğalmasını ve birden çok ileti gönderme gereksinimini önlemek için şablonları kullanırsınız.

Şablonlar, belirli bir cihazın nasıl bildirim alacağını belirtmenin bir yoludur. Şablon, uygulama arka ucunuz tarafından gönderilen iletinin parçası olan özelliklere başvurarak tam yük biçimini belirtir. Sizin durumunuzda, desteklenen tüm dilleri içeren yerel ayardan bağımsız bir ileti gönderirsiniz:

{
    "News_English": "...",
    "News_French": "...",
    "News_Mandarin": "..."
}

Ardından cihazların doğru özelliğe başvuran bir şablonla kaydolduğundan emin olursunuz. Örneğin, Fransızca haber kayıtlarına kaydolmak isteyen bir iOS uygulaması aşağıdaki söz dizimini kullanarak kaydeder:

{
    aps: {
        alert: "$(News_French)"
    }
}

Şablonlar hakkında daha fazla bilgi için Şablonlar makalesine bakın.

Önkoşullar

Uygulama kullanıcı arabirimini güncelleştirme

Bu bölümde, Notification Hubs kullanarak son dakika haberlerini göndermek için şablonları kullanarak yerelleştirilmiş son dakika haberleri gönderme konusunda oluşturduğunuz Son Dakika Haberleri uygulamasını değiştireceksiniz.

içinde MainStoryboard_iPhone.storyboard, üç dil içeren bir Segmentli Denetim ekleyin: İngilizce, Fransızca ve Mandarin.

iOS UI görsel taslak oluşturma

Ardından, aşağıdaki görüntüde gösterildiği gibi ViewController.h dosyasına bir IBOutlet eklediğinizden emin olun:

Anahtarlar için çıkışlar oluşturma

iOS uygulamasını derleme

  1. dosyanızda Notification.hyöntemini ekleyin retrieveLocale ve aşağıdaki kodda gösterildiği gibi depo ve abone olma yöntemlerini değiştirin:

    - (void) storeCategoriesAndSubscribeWithLocale:(int) locale categories:(NSSet*) categories completion: (void (^)(NSError* error))completion;
    
    - (void) subscribeWithLocale:(int) locale categories:(NSSet*) categories completion:(void (^)(NSError *))completion;
    
    - (NSSet*) retrieveCategories;
    
    - (int) retrieveLocale;
    

    içinde Notification.m, parametresini storeCategoriesAndSubscribe ekleyerek locale ve kullanıcı varsayılanlarında depolayarak yöntemini değiştirin:

    - (void) storeCategoriesAndSubscribeWithLocale:(int) locale categories:(NSSet *)categories completion:(void (^)(NSError *))completion {
        NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
        [defaults setValue:[categories allObjects] forKey:@"BreakingNewsCategories"];
        [defaults setInteger:locale forKey:@"BreakingNewsLocale"];
        [defaults synchronize];
    
        [self subscribeWithLocale: locale categories:categories completion:completion];
    }
    

    Ardından abone olma yöntemini yerel ayarı içerecek şekilde değiştirin:

    - (void) subscribeWithLocale: (int) locale categories:(NSSet *)categories completion:(void (^)(NSError *))completion{
        SBNotificationHub* hub = [[SBNotificationHub alloc] initWithConnectionString:@"<connection string>" notificationHubPath:@"<hub name>"];
    
        NSString* localeString;
        switch (locale) {
            case 0:
                localeString = @"English";
                break;
            case 1:
                localeString = @"French";
                break;
            case 2:
                localeString = @"Mandarin";
                break;
        }
    
        NSString* template = [NSString stringWithFormat:@"{\"aps\":{\"alert\":\"$(News_%@)\"},\"inAppMessage\":\"$(News_%@)\"}", localeString, localeString];
    
        [hub registerTemplateWithDeviceToken:self.deviceToken name:@"localizednewsTemplate" jsonBodyTemplate:template expiryTemplate:@"0" tags:categories completion:completion];
    }
    

    yerine yöntemini registerTemplateWithDeviceTokenregisterNativeWithDeviceTokenkullanırsınız. Bir şablona kaydolduysanız, json şablonunu ve şablon için bir ad sağlamanız gerekir (uygulama farklı şablonları kaydetmek isteyebilir). Bu haberler için bildirimleri aldığınızdan emin olmak için kategorilerinizi etiket olarak kaydettiğinizden emin olun.

    Kullanıcının varsayılan ayarlarından yerel ayarı almak için bir yöntem ekleyin:

    - (int) retrieveLocale {
        NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    
        int locale = [defaults integerForKey:@"BreakingNewsLocale"];
    
        return locale < 0?0:locale;
    }
    
  2. Artık sınıfını değiştirdiğinize Notifications göre, öğesinin ViewController yeni UISegmentControlöğesini kullandığından emin olmanız gerekir. Şu anda seçili olan yerel ayarı gösterdiğinden emin olmak için yöntemine aşağıdaki satırı viewDidLoad ekleyin:

    self.Locale.selectedSegmentIndex = [notifications retrieveLocale];
    

    Ardından, yönteminizde subscribe çağrısı storeCategoriesAndSubscribe olarak aşağıdaki kodla değiştirin:

    [notifications storeCategoriesAndSubscribeWithLocale: self.Locale.selectedSegmentIndex categories:[NSSet setWithArray:categories] completion: ^(NSError* error) {
        if (!error) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Notification" message:
                                    @"Subscribed!" delegate:nil cancelButtonTitle:
                                    @"OK" otherButtonTitles:nil, nil];
            [alert show];
        } else {
            NSLog(@"Error subscribing: %@", error);
        }
    }];
    
  3. Son olarak, uygulamanız başlatıldığında kaydınızı doğru şekilde yenileyebilmek için AppDelegate.m'nizde yöntemini güncelleştirmeniz didRegisterForRemoteNotificationsWithDeviceToken gerekir. Çağrınızı subscribe aşağıdaki kodla bildirim yöntemine değiştirin:

    NSSet* categories = [self.notifications retrieveCategories];
    int locale = [self.notifications retrieveLocale];
    [self.notifications subscribeWithLocale: locale categories:categories completion:^(NSError* error) {
        if (error != nil) {
            NSLog(@"Error registering for notifications: %@", error);
        }
    }];
    

(isteğe bağlı) .NET konsol uygulamasından yerelleştirilmiş şablon bildirimleri gönderme

Şablon bildirimleri gönderdiğinizde, yalnızca bir özellik kümesi sağlamanız gerekir. Bu senaryoda, özellikler kümesi geçerli haberlerin yerelleştirilmiş sürümünü içerir.

{
    "News_English": "World News in English!",
    "News_French": "World News in French!",
    "News_Mandarin": "World News in Mandarin!"
}

C# konsol uygulaması kullanarak bildirim gönderme

Bu bölümde, bir konsol uygulaması kullanarak nasıl bildirim gönderebilirsiniz gösterilmektedir. Kod, bildirimleri hem Windows Mağazası hem de iOS cihazlarına yayınlar. Daha önce oluşturduğunuz konsol uygulamasındaki SendTemplateNotificationAsync yöntemini aşağıdaki kodla 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"}};

    // Sending the notification as a template notification. All template registrations that contain 
    // "messageParam" or "News_<local selected>" and the proper tags will receive the notifications. 
    // This includes APNS, GCM, WNS, and MPNS template registrations.
    Dictionary<string, string> templateParams = new Dictionary<string, string>();

    // Create an array of breaking news categories.
    var categories = new string[] { "World", "Politics", "Business", "Technology", "Science", "Sports"};
    var locales = new string[] { "English", "French", "Mandarin" };

    foreach (var category in categories)
    {
        templateParams["messageParam"] = "Breaking " + category + " News!";

        // Sending localized News for each tag too...
        foreach( var locale in locales)
        {
            string key = "News_" + locale;

            // Your real localized news content would go here.
            templateParams[key] = "Breaking " + category + " News in " + locale + "!";
        }

        await hub.SendTemplateNotificationAsync(templateParams, category);
    }
}

SendTemplateNotificationAsync yöntemi, platformdan bağımsız olarak yerelleştirilmiş haber parçasını tüm cihazlarınıza sunar. Bildirim hub'ınız, belirli bir etikete abone olan tüm cihazlara doğru yerel yükü oluşturur ve teslim eder.

Mobile Services ile bildirim gönderme

Mobile Services zamanlayıcınızda aşağıdaki betiği kullanın:

var azure = require('azure');
var notificationHubService = azure.createNotificationHubService('<hub name>', '<connection string with full access>');
var notification = {
        "News_English": "World News in English!",
        "News_French": "World News in French!",
        "News_Mandarin", "World News in Mandarin!"
}
notificationHubService.send('World', notification, function(error) {
    if (!error) {
        console.warn("Notification successful");
    }
});

(isteğe bağlı) Cihazdan yerelleştirilmiş şablon bildirimleri gönderme

Visual Studio'ya erişiminiz yoksa veya yalnızca yerelleştirilmiş şablon bildirimlerini doğrudan cihazda uygulamadan göndermeyi test etmek istiyorsanız. Yerelleştirilmiş şablon parametrelerini önceki öğreticide SendNotificationRESTAPI tanımladığınız yönteme ekleyebilirsiniz.

- (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 : %@\","
            \"News_English\":\"Breaking %@ News in English : %@\","
            \"News_French\":\"Breaking %@ News in French : %@\","
            \"News_Mandarin\":\"Breaking %@ News in Mandarin : %@\","
            categoryTag, self.notificationMessage.text,
            categoryTag, self.notificationMessage.text,  // insert English localized news here
            categoryTag, self.notificationMessage.text,  // insert French localized news here
            categoryTag, self.notificationMessage.text]; // insert Mandarin localized news here

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

Sonraki adımlar

Bu öğreticide, iOS cihazlarına yerelleştirilmiş bildirimler gönderdiniz. iOS uygulamalarının belirli kullanıcılarına anında iletme bildirimleri göndermeyi öğrenmek için aşağıdaki öğreticiye ilerleyin: