Aracılığıyla paylaş


Azure Notification Hubs Güvenli Anında İletme

Genel Bakış

Microsoft Azure'da anında iletme bildirimi desteği, mobil platformlar için hem tüketici hem de kurumsal uygulamalar için anında iletme bildirimlerinin uygulanmasını büyük ölçüde basitleştiren kullanımı kolay, çok platformlu, ölçeklendirilmiş bir anında iletme altyapısına erişmenizi sağlar.

Mevzuat veya güvenlik kısıtlamaları nedeniyle, bazen bir uygulama bildirime standart anında iletme bildirimi altyapısı üzerinden aktarılamayan bir şey eklemek isteyebilir. Bu öğreticide, istemci cihaz ve uygulama arka ucu arasında güvenli, kimliği doğrulanmış bir bağlantı aracılığıyla hassas bilgiler göndererek aynı deneyimin nasıl sağlandığı açıklanır.

Yüksek düzeyde akış aşağıdaki gibidir:

  1. Uygulama arka ucu:
    • Güvenli yükü arka uç veritabanında depolar.
    • Bu bildirimin kimliğini cihaza gönderir (güvenli bilgi gönderilmez).
  2. Bildirim alınırken cihazdaki uygulama:
    • Cihaz, güvenli yük isteyen arka uçla iletişim kurar.
    • Uygulama, yükü cihazda bildirim olarak gösterebilir.

Önceki akışta (ve bu öğreticide) kullanıcının oturum açmasının ardından cihazın yerel depolama alanında bir kimlik doğrulama belirteci depoladığını varsaydığımıza dikkat etmek önemlidir. Bu, cihaz bu belirteci kullanarak bildirimin güvenli yükünü alabildiği için sorunsuz bir deneyim garanti eder. Uygulamanız kimlik doğrulama belirteçlerini cihazda depolamıyorsa veya bu belirteçlerin süresi dolabiliyorsa, bildirim alındığında cihaz uygulaması kullanıcıdan uygulamayı başlatmasını isteyen genel bir bildirim görüntülemelidir. Uygulama daha sonra kullanıcının kimliğini doğrular ve bildirim yükünü gösterir.

Bu Güvenli Anında İletme öğreticisi, güvenli bir şekilde anında iletme bildirimi göndermeyi gösterir. Öğretici, Kullanıcılara Bildirme öğreticisini temel alır, bu nedenle önce bu öğreticideki adımları tamamlamanız gerekir.

Not

Bu öğreticide, Azure Notification Hubs kullanarak iOS uygulamalarına anında iletme bildirimleri gönderme başlığında açıklandığı gibi bildirim hub'ınızı oluşturduğunuz ve yapılandırdığınız varsayılır.

WebAPI Projesi

  1. Visual Studio'da, Kullanıcılara Bildir öğreticisinde oluşturduğunuz AppBackend projesini açın.

  2. Notifications.cs dosyasında Notifications sınıfının tamamını aşağıdaki kodla değiştirin. Yer tutucuları bildirim hub'ınız için bağlantı dizenizle (tam erişimli) ve hub adıyla değiştirmeyi unutmayın. Bu değerleri Azure portal alabilirsiniz. Bu modül artık gönderilecek farklı güvenli bildirimleri temsil eder. Tam bir uygulamada, bildirimler bir veritabanında depolanır; kolaylık olması için, bu durumda bunları bellekte depolarız.

     public class Notification
     {
         public int Id { get; set; }
         public string Payload { get; set; }
         public bool Read { get; set; }
     }
    
     public class Notifications
     {
         public static Notifications Instance = new Notifications();
    
         private List<Notification> notifications = new List<Notification>();
    
         public NotificationHubClient Hub { get; set; }
    
         private Notifications() {
             Hub = NotificationHubClient.CreateClientFromConnectionString("{conn string with full access}",     "{hub name}");
         }
    
         public Notification CreateNotification(string payload)
         {
             var notification = new Notification() {
             Id = notifications.Count,
             Payload = payload,
             Read = false
             };
    
             notifications.Add(notification);
    
             return notification;
         }
    
         public Notification ReadNotification(int id)
         {
             return notifications.ElementAt(id);
         }
     }
    
  3. NotificationsController.cs dosyasında NotificationsController sınıf tanımının içindeki kodu aşağıdaki kodla değiştirin. Bu bileşen, cihazın bildirimi güvenli bir şekilde alması için bir yol uygular ve ayrıca (bu öğreticinin amaçları doğrultusunda) cihazlarınıza güvenli bir gönderimi tetiklemenin bir yolunu sağlar. Bildirimi bildirim hub'ına gönderirken yalnızca bildirimin kimliğiyle (ve gerçek ileti olmadan) ham bir bildirim gönderdiğimizi unutmayın:

     public NotificationsController()
     {
         Notifications.Instance.CreateNotification("This is a secure notification!");
     }
    
     // GET api/notifications/id
     public Notification Get(int id)
     {
         return Notifications.Instance.ReadNotification(id);
     }
    
     public async Task<HttpResponseMessage> Post()
     {
         var secureNotificationInTheBackend = Notifications.Instance.CreateNotification("Secure confirmation.");
         var usernameTag = "username:" + HttpContext.Current.User.Identity.Name;
    
         // windows
         var rawNotificationToBeSent = new Microsoft.Azure.NotificationHubs.WindowsNotification(secureNotificationInTheBackend.Id.ToString(),
                         new Dictionary<string, string> {
                             {"X-WNS-Type", "wns/raw"}
                         });
         await Notifications.Instance.Hub.SendNotificationAsync(rawNotificationToBeSent, usernameTag);
    
         // apns
         await Notifications.Instance.Hub.SendAppleNativeNotificationAsync("{\"aps\": {\"content-available\": 1}, \"secureId\": \"" + secureNotificationInTheBackend.Id.ToString() + "\"}", usernameTag);
    
         // gcm
         await Notifications.Instance.Hub.SendGcmNativeNotificationAsync("{\"data\": {\"secureId\": \"" + secureNotificationInTheBackend.Id.ToString() + "\"}}", usernameTag);
    
         return Request.CreateResponse(HttpStatusCode.OK);
     }
    

Yönteminin Post artık bildirim göndermediğini unutmayın. Herhangi bir hassas içeriği değil, yalnızca bildirim kimliğini içeren bir ham bildirim gönderir. Ayrıca, bildirim hub'ınızda kimlik bilgilerinin yapılandırılmadığı platformlar için gönderme işlemine açıklama eklediğinizden emin olun; bunlar hatalara neden olur.

  1. Şimdi bu uygulamayı tüm cihazlardan erişilebilir hale getirmek için bir Azure Web Sitesine yeniden dağıtacağız. AppBackend projesine sağ tıklayıp Yayımla’yı seçin.
  2. Yayımlama hedefiniz olarak Azure Web Sitesi'ne tıklayın. Azure hesabınızla oturum açın, var olan veya yeni bir Web Sitesi seçin ve Bağlantı sekmesinde hedef URL özelliğini not edin. Bu öğreticinin ilerleyen bölümlerinde arka uç uç noktanız olarak bu URL'ye başvuracağız. Yayımla’ya tıklayın.

iOS projesini değiştirme

Uygulamanızın arka ucunu yalnızca bir bildirimin kimliğini gönderecek şekilde değiştirdiğinize göre, iOS uygulamanızı bu bildirimi işleyecek şekilde değiştirmeniz ve görüntülenecek güvenli iletiyi almak için arka ucunuzu geri aramanız gerekir.

Bu hedefe ulaşmak için uygulama arka ucundan güvenli içeriği almak için mantığı yazmamız gerekir.

  1. içinde AppDelegate.m, uygulamanın arka uçtan gönderilen bildirim kimliğini işlemesi için sessiz bildirimlere kaydoldığından emin olun. UIRemoteNotificationTypeNewsstandContentAvailability didFinishLaunchingWithOptions içinde seçeneğini ekleyin:

    [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeNewsstandContentAvailability];
    
  2. AppDelegate.m Üst kısımda aşağıdaki bildirimi içeren bir uygulama bölümü ekleyin:

    @interface AppDelegate ()
    - (void) retrieveSecurePayloadWithId:(int)payloadId completion: (void(^)(NSString*, NSError*)) completion;
    @end
    
  3. Ardından uygulama bölümüne aşağıdaki kodu ekleyin ve yer tutucuyu {back-end endpoint} daha önce elde edilen arka ucunuzun uç noktasıyla değiştirin:

    NSString *const GetNotificationEndpoint = @"{back-end endpoint}/api/notifications";
    
    - (void) retrieveSecurePayloadWithId:(int)payloadId completion: (void(^)(NSString*, NSError*)) completion;
    {
        // check if authenticated
        ANHViewController* rvc = (ANHViewController*) self.window.rootViewController;
        NSString* authenticationHeader = rvc.registerClient.authenticationHeader;
        if (!authenticationHeader) return;
    
        NSURLSession* session = [NSURLSession
                                    sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
                                    delegate:nil
                                    delegateQueue:nil];
    
        NSURL* requestURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%d", GetNotificationEndpoint, payloadId]];
        NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:requestURL];
        [request setHTTPMethod:@"GET"];
        NSString* authorizationHeaderValue = [NSString stringWithFormat:@"Basic %@", authenticationHeader];
        [request setValue:authorizationHeaderValue forHTTPHeaderField:@"Authorization"];
    
        NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response;
            if (!error && httpResponse.statusCode == 200)
            {
                NSLog(@"Received secure payload: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    
                NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error: &error];
    
                completion([json objectForKey:@"Payload"], nil);
            }
            else
            {
                NSLog(@"Error status: %ld, request: %@", (long)httpResponse.statusCode, error);
                if (error)
                    completion(nil, error);
                else {
                    completion(nil, [NSError errorWithDomain:@"APICall" code:httpResponse.statusCode userInfo:nil]);
                }
            }
        }];
        [dataTask resume];
    }
    

    Bu yöntem, paylaşılan tercihlerde depolanan kimlik bilgilerini kullanarak bildirim içeriğini almak için uygulamanızın arka ucunu çağırır.

  4. Şimdi gelen bildirimi işleyin ve görüntülenecek içeriği almak için yukarıdaki yöntemi kullanın. İlk olarak, anında iletme bildirimi alırken iOS uygulamanızın arka planda çalışmasını etkinleştirin. XCode'da sol panelden uygulama projenizi seçin, ardından merkezi bölmedeki Hedefler bölümünde ana uygulama hedefinize tıklayın.

  5. Ardından merkezi bölmenizin üst kısmındaki Özellikler sekmesine tıklayın ve Uzaktan Bildirimler kutusunu işaretleyin.

    Uygulama projesi seçili ve Özellikler sekmesi açık durumda olan XCode'un ekran görüntüsü. Uzak bildirimler onay kutusu seçilidir.

  6. anında AppDelegate.m iletme bildirimlerini işlemek için aşağıdaki yöntemi ekleyin:

    -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    {
        NSLog(@"%@", userInfo);
    
        [self retrieveSecurePayloadWithId:[[userInfo objectForKey:@"secureId"] intValue] completion:^(NSString * payload, NSError *error) {
            if (!error) {
                // show local notification
                UILocalNotification* localNotification = [[UILocalNotification alloc] init];
                localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:0];
                localNotification.alertBody = payload;
                localNotification.timeZone = [NSTimeZone defaultTimeZone];
                [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    
                completionHandler(UIBackgroundFetchResultNewData);
            } else {
                completionHandler(UIBackgroundFetchResultFailed);
            }
        }];
    
    }
    

    Kimlik doğrulama üst bilgisi özelliğinin eksik olması veya arka uç tarafından reddedilmesi durumlarını işlemenin tercih edileceğini unutmayın. Bu durumların belirli bir şekilde ele alınması çoğunlukla hedef kullanıcı deneyiminize bağlıdır. Seçeneklerden biri, kullanıcının gerçek bildirimi almak için kimlik doğrulaması gerçekleştirmesi için genel bir istem içeren bir bildirim görüntülemektir.

Uygulamayı Çalıştırma

Uygulamayı çalıştırmak için aşağıdakileri yapın:

  1. XCode'da uygulamayı fiziksel bir iOS cihazında çalıştırın (anında iletme bildirimleri simülatörde çalışmaz).
  2. iOS uygulama kullanıcı arabiriminde bir kullanıcı adı ve parola girin. Bunlar herhangi bir dize olabilir, ancak aynı değer olmalıdır.
  3. iOS uygulama kullanıcı arabiriminde Oturum aç'a tıklayın. Ardından Gönderme gönder'e tıklayın. Bildirim merkezinizde güvenli bildirimin görüntülendiğini görmeniz gerekir.