Mobile Services JS Backend - Push Notification

Bu yazıda Azure Mobile Services Push özelliğinden bahsedeceğim. Mobile Services üzerinden bir kaç satırlık JS kodu ile Windows Phone, Windows, IOS, Android cihazlara push notification göndermeniz mümkün. Visual Studio ile gelen özellikler sayesinde bu özelliğin Windows veya Windows Phone projelerine eklemek oldukça kolay, Universal App geliştiriyorsanız bu özelliği iki proje içinde implement etmeniz gerekecek.

Bu işlemi yapabilmemiz için bir Windows Store Dev Center üyelğine ve bir Azure Mobile Services'a ihtiyacımız var.

Ben örnek proje olarak Windows Store App yapacağım. Yeni bir Windows Store App yaratıyoruz ve solution explorer'da proje üzerine sağ tuş ile tıklayarak Add -> Push Notification'a tıklıyoruz. Karşınıza çıkan pencerede Next'e tıklıyoruz ve bizden Microsoft Account istiyor. Bu account sizin Windows Store Dev Center account'unuz olmalı. Daha sonra uygulamanızın Store ile eşleştirilmesi gerekiyor. Daha sonra azure mobile services ile eşleştirmeniz için Visual Studio size yardımcı olacak. Daha sonra finish butonu ile açılan pencereyi tamamlıyoruz ve projeye bizim için bir kaç satır kod ekliyor.

Projemize eklenen kodlara bakalım,

   

Solution Explorer

   

Gördüğünüz gibi push.register.cs adında bir dosya eklendi. İçeriğine baktığımızda MobileServices client nesnesi üzerinden Register olduğunu göreceğiz. Aslında mantık olarak şu şekilde çalışmakta, uygulamanız kapalı bile olsa push notification gelebilmeli ve her uygulamanın push notificationi için ayrı ayrı listener olmaması için bu push notification alma işi işletim sistemi düzeyinde handle ediliyor. Uygulama işletim sisteminden bir channel request ediyor, ve işletim sistemi bizim uygulamamız için bir channel yaratıyor, bu channel'in uri'sini mobile service'e gönderiyoruz ve daha sonra push notification atmak istediğimizde, istek Windows Notification Service'lare gönderiliyor ve bu service'ler bizim cihazımıza notification'i push ediyor. OS requesti alıyor ve notificationi gösteriyor. Aralara girip müdahale etmemizde mümkün olsada genel yapı bu şekilde çalışıyor. Aşağıdaki diagram konuyu özetliyor.

   

Push Notification Diagram

   

Kodları inceleyim,

Yukarıdaki kodlarda gördüğünüz gibi ilk önce CreatePushNotificationChannelForApplicationAsync methodu ile channel yaratılıyor ve RegisterNativeAsync(channel.Uri); methodu ile yaratılmış channel'in uri'si azure mobile service'e gönderiliyor. Daha sonrada test amaçlı olarak InvokeApiAsync methodu ile bir custom api (notifyAllUsers) çağrılıyor. Bu UploadChannel methodu App.xaml.cs içerisinden uygulama açılırken çağırılıyor ve uygulama açılırken kendisini azure mobile service'a push notification için register etmesi sağlaniyor. Haliyle uygulama açılır açılmaz notification geliyor. Çünkü notifyAllUsers cağırılıyor, bu cağrıyı iptal edip sadece register edebilirsiniz.

   

Şimdi gidelim ve bu custom api ne işe yarıyor bunu inceleyelim. Azure Management Portal'dan veya Visual Studio Solution Explorer'dan ilgili Mobile Services altında notifyAllUsers.js kodlarına ulaşabilirsiniz. Aşağıdaki kodların içerisinde açıklamaları bulabilirsiniz.

Uygulamayı çalıştırdığınız push notification geldiğini göreceksiniz.

   

Push Notification

Örneğin sizde Mobile Services Scheduler ile her 15 dk'da bir haber sitelerini kontrol edip, son dakika gelişmesi var ise kullanıcılarınıza push notification atabilirsiniz.

Kaynak kodları buradan indirebilirsiniz.

Mobile Services JS Backend - Scheduler

Mobile Services Scheduler ile yazdığımız kodların otomatik olarak belli zaman aralıklarında veya istediğimiz zaman çalışmasını sağlamak mümkün. Örneğin merkez bankasından doviz kurlarını çekerek database'e yazıyorsanız ve bu işlemin her 15dk'da bir tekrar etmesini isterseniz, Scheduler sizin için kullanışlı olacaktır.

Yukarıda verdiğim örneğe çok benzer bir örnek üzerinde çalışalım.

Merkez Bankası bu verileri xml olarak vereceğinden ilk örnek için biraz karışık olabilir. Json olarak verileri alabileceğimiz bir kaynak var. http://jsonrates.com/ adresinden istediğim para birimleri arasındaki dönüşümleri json olarak almamız mümkün.

İlk olarak mobile services içerisinde ismi CurrencyRates olan bir tablo yaratıyoruz. (Nasıl tablo yaratacağınızı buradan öğrenebilirsiniz.)

Daha sonra jsonrates.com sitesinden bir hesap oluşturmanız gerekiyor. Size bir api key verecek ve bunu requestlerimizde kullanacağız.

Şimdi sırada Scheduler var, Mobile Service içierinden Scheduler tabına giriyoruz ve "Create a Scheduled Job" yazısına tıklıyoruz. CurrencyInsertJob adında bir scheduler job yaratıyoruz.

CurrencytInsertJob

Yukarıda gördüğünüz gibi job'I yaratırken bize ne sıklıkta çalışacağını soruyor. Default olarak her 15 dakikada bir çalışmak üzere ayarlı. Bu şekilde sağ altta bulunan butona basarak job'u oluşturuyoruz.

Ben her 15dk'da bir kez çalışmasını istedim, ama siz bunu değiştirebilirsiniz veya On Demand seçeneğini seçerek istediğiniz zaman çalışmasını sağlayabilirsiniz.

*Mobile Service free mode seçili ise sadece bir tane job oluşturmanız mümkün. Daha fazla job oluşturmak isterseniz mobile service'i scale etmeniz gerekecek, ilerleyen yazılarda buna değineceğim.

Yarattığımız job'un içine giriyoruz ve Script tabına tıklıyoruz, açılan sayfada bir code editor bizi bekliyor. Aşağıdaki kodu yazarak jsonrates.com'dan TRY ve USD arasındaki dönüşümü çekip tabloya yazmanız mümkün, unutmatın bu kod her 15dk'da bir kez çalışacak.(Kendi API key'inizi yazmayı unutmayın.)

Yukarıdaki kod ile birlikte istediğimizi yaptırdık ancak job şuanda disabled. Sayfanın en altında bulunan butonlar ile enable etmeniz mümkün veya Run Once'a tıklayarak hemen bir kez çalıştırmanız mümkün.

İlk başta 15dk'da bir çalışssın istemiştik ancak bu yazıyı yazarken 15 dk beklemek istemediğim için ben bunu bir dakikada bir kez çalışsın olarak değiştirmek istiyorum. Bunun için yukarıdaki Configure tabına geçiyoruz ve buradan ayarları değiştiriyoruz.

CurrencyInsertJob Configure

Sonuc olarak Data tabi altında bulunan CurrencyRates tablosuna baktığımızda işlemin sonucunu göreceğiz.  

   

CurrencyRates Sonuc

Kendi senaryonuza uygularken aşağıdaki link sizin için oldukça faydalı olacaktır. Mobile Services JavaScript backend Node.js ile kodlanıyor ve aşağıdaki dokumandan mobile services'e özel node.js kütüphanelerine ulaşmanız mümkün.

https://msdn.microsoft.com/en-us/library/azure/jj554226.aspx