Aracılığıyla paylaş


Azure Notification Hubs'dan güvenli anında iletme bildirimleri gönderme

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. Cihaz bu belirteci kullanarak bildirimin güvenli yükünü alabildiği için bu tamamen sorunsuz bir deneyim garanti eder. Uygulamanız cihazda kimlik doğrulama belirteçlerini depolamıyorsa veya bu belirteçlerin süresi dolabiliyorsa, cihaz uygulaması, bildirimi aldıktan sonra 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 öğreticide güvenli bir şekilde anında iletme bildirimi gönderme gösterilmektedir. Öğretici, Kullanıcılara bildirme öğreticisini temel alır, bu nedenle önce bu öğreticideki adımları tamamlamanız gerekir.

Not

Bu öğreticide, bildirim hub'ınızı Evrensel Windows Platformu uygulamalara bildirim gönderme bölümünde açıklandığı gibi oluşturduğunuz ve yapılandırdığınız varsayılır. Ayrıca, Windows Phone 8.1 için Windows (Windows Phone değil) kimlik bilgileri gerektiğini ve arka plan görevlerinin Windows Phone 8.0 veya Silverlight 8.1'de çalışmadığını unutmayın. Windows Mağazası uygulamaları için, yalnızca uygulama kilit ekranı etkinse (Appmanifest'te onay kutusuna tıklayın) bir arka plan görevi aracılığıyla bildirim alabilirsiniz.

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.

Windows Phone projesini değiştirme

  1. NotifyUserWindowsPhone projesinde, aşağıdaki kodu App.xaml.cs dosyasına ekleyerek arka plan gönderme görevini kaydedin. OnLaunched() yönteminin sonuna aşağıdaki kod satırını ekleyin:

    RegisterBackgroundTask();
    
  2. Yine App.xaml.cs dosyasında aşağıdaki kodu yönteminin OnLaunched() hemen arkasına ekleyin:

    private async void RegisterBackgroundTask()
    {
        if (!Windows.ApplicationModel.Background.BackgroundTaskRegistration.AllTasks.Any(i => i.Value.Name == "PushBackgroundTask"))
        {
            var result = await BackgroundExecutionManager.RequestAccessAsync();
            var builder = new BackgroundTaskBuilder();
    
            builder.Name = "PushBackgroundTask";
            builder.TaskEntryPoint = typeof(PushBackgroundComponent.PushBackgroundTask).FullName;
            builder.SetTrigger(new Windows.ApplicationModel.Background.PushNotificationTrigger());
            BackgroundTaskRegistration task = builder.Register();
        }
    }
    
  3. App.xaml.cs dosyasının en üstüne aşağıdaki using deyimleri ekleyin:

    using Windows.Networking.PushNotifications;
    using Windows.ApplicationModel.Background;
    
  4. Visual Studio'daki Dosya menüsünde Tümünü Kaydet'e tıklayın.

Anında iletme arka plan bileşenini oluşturma

Sonraki adım, anında iletme arka planı bileşenini oluşturmaktır.

  1. Çözüm Gezgini'da çözümün en üst düzey düğümüne (bu örnekte Solution SecurePush) sağ tıklayın, ardından Ekle'ye ve ardından Yeni Proje'ye tıklayın.

  2. Mağaza Uygulamaları'nı genişletin, Windows Phone Uygulamalar'a tıklayın, ardından bileşen Windows Çalışma Zamanı (Windows Phone) seçeneğine tıklayın. Projeyi PushBackgroundComponent olarak adlandırın ve projeyi oluşturmak için Tamam'a tıklayın.

    Windows Çalışma Zamanı Bileşeni (Windows Phone) Visual C# seçeneğinin vurgulandığı Yeni Proje Ekle iletişim kutusunun ekran görüntüsü.

  3. Çözüm Gezgini'da PushBackgroundComponent (Windows Phone 8.1) projesine sağ tıklayın, ekle'ye ve ardından Sınıf'a tıklayın. Yeni sınıfı olarak adlandırın PushBackgroundTask.cs. Sınıfı oluşturmak için Ekle'ye tıklayın.

  4. Ad alanı tanımının PushBackgroundComponent tüm içeriğini aşağıdaki kodla değiştirerek yer tutucuyu {back-end endpoint} arka ucunuzu dağıtırken elde edilen arka uç uç noktasıyla değiştirin:

    public sealed class Notification
        {
            public int Id { get; set; }
            public string Payload { get; set; }
            public bool Read { get; set; }
        }
    
        public sealed class PushBackgroundTask : IBackgroundTask
        {
            private string GET_URL = "{back-end endpoint}/api/notifications/";
    
            async void IBackgroundTask.Run(IBackgroundTaskInstance taskInstance)
            {
                // Store the content received from the notification so it can be retrieved from the UI.
                RawNotification raw = (RawNotification)taskInstance.TriggerDetails;
                var notificationId = raw.Content;
    
                // retrieve content
                BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
                var httpClient = new HttpClient();
                var settings = ApplicationData.Current.LocalSettings.Values;
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", (string)settings["AuthenticationToken"]);
    
                var notificationString = await httpClient.GetStringAsync(GET_URL + notificationId);
    
                var notification = JsonConvert.DeserializeObject<Notification>(notificationString);
    
                ShowToast(notification);
    
                deferral.Complete();
            }
    
            private void ShowToast(Notification notification)
            {
                ToastTemplateType toastTemplate = ToastTemplateType.ToastText01;
                XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
                XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");
                toastTextElements[0].AppendChild(toastXml.CreateTextNode(notification.Payload));
                ToastNotification toast = new ToastNotification(toastXml);
                ToastNotificationManager.CreateToastNotifier().Show(toast);
            }
        }
    
  5. Çözüm Gezgini'da PushBackgroundComponent (Windows Phone 8.1) projesine sağ tıklayın ve ardından NuGet Paketlerini Yönet'e tıklayın.

  6. Sol taraftaki Çevrimiçi öğesine tıklayın.

  7. Arama kutusuna Http İstemcisi yazın.

  8. Sonuç listesinde Microsoft HTTP İstemci Kitaplıkları'na ve ardından Yükle'ye tıklayın. Yüklemeyi tamamlayın.

  9. NuGet Arama kutusuna Json.net yazın. Json.NET paketini yükleyin, ardından NuGet Paket Yöneticisi penceresini kapatın.

  10. Dosyanın en üstüne PushBackgroundTask.cs aşağıdaki using deyimleri ekleyin:

    using Windows.ApplicationModel.Background;
    using Windows.Networking.PushNotifications;
    using System.Net.Http;
    using Windows.Storage;
    using System.Net.Http.Headers;
    using Newtonsoft.Json;
    using Windows.UI.Notifications;
    using Windows.Data.Xml.Dom;
    
  11. Çözüm Gezgini,NotifyUserWindowsPhone (Windows Phone 8.1) projesinde Başvurular'a sağ tıklayın ve ardından Başvuru Ekle...'ye tıklayın. Başvuru Yöneticisi iletişim kutusunda PushBackgroundComponent öğesinin yanındaki kutuyu işaretleyin ve tamam'a tıklayın.

  12. Çözüm Gezgini NotifyUserWindowsPhone (Windows Phone 8.1) projesinde Package.appxmanifest öğesine çift tıklayın. Bildirimler'in altında Bildirim Özellikli'yiEvet olarak ayarlayın.

    Paket.appxmanifest'e odaklanan Çözüm Gezgini penceresinin ekran görüntüsü. Tost özellikli seçeneği Kırmızıyla vurgulanmış Evet olarak ayarlanmış.

  13. Package.appxmanifest'teyken üst kısımdaki Bildirimler menüsüne tıklayın. Kullanılabilir Bildirimler açılan listesinde Arka Plan Görevleri'ne ve ardından Ekle'ye tıklayın.

  14. Package.appxmanifest'tekiÖzellikler'in altında Anında iletme bildirimi'ni işaretleyin.

  15. Package.appxmanifest'te, Uygulama Ayarları'nın altında, Giriş Noktası alanına PushBackgroundComponent.PushBackgroundTask yazın.

    Kullanılabilir Bildirimler, Desteklenen Bildirimler, Anında İletme bildirimleri ve Giriş noktası seçeneklerinin kırmızıyla vurgulandığı Package.appxmanifest dosyasına odaklanan Çözüm Gezgini penceresinin ekran görüntüsü.

  16. Dosya menüsünden Tümünü Kaydet'e tıklayın.

Uygulamayı çalıştırma

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

  1. Visual Studio'da AppBackend Web API uygulamasını çalıştırın. bir ASP.NET web sayfası görüntülenir.
  2. Visual Studio'da NotifyUserWindowsPhone (Windows Phone 8.1) Windows Phone uygulamasını çalıştırın. Windows Phone öykünücüsü uygulamayı otomatik olarak çalıştırır ve yükler.
  3. NotifyUserWindowsPhone uygulama kullanıcı arabiriminde bir kullanıcı adı ve parola girin. Bunlar herhangi bir dize olabilir, ancak aynı değer olmalıdır.
  4. NotifyUserWindowsPhone uygulama kullanıcı arabiriminde Oturum aç ve kaydet'e tıklayın. Ardından Gönderme gönder'e tıklayın.