13 Ağustos 2014 Çarşamba

XE6 PushEvents ve KinveyProvider Kullanımı

Merhabalar,

Aslında pek ilgi olmadığı için blogda paylaşım yapmayı bıracaktım, fakat Tahsin abi sağolsun arayıp paylaşımlardan dolayı teşekkür etti ve bende takip eden olduğunu anca o zaman farkına varmış oldum. Tahsin abiye selamlar buradan.

Gelelim asıl konumuza;

Bir çok arkadaşımız veritabanı entegreli uygulamalar yapmakta bunların çeşitli türleri mevcut google play üzerinde. Uygulamalarımız kullanıcı karşısına çıktıkça yenilenmeden duramayacağı için kullanıcılara bildirimler yapılması şarttır.
Bu bildirimleri Mail, Sms vs. birçok yöntemle yapabilirsiniz.
Ama bunların daha iyisi olarak android dünyasının bizlere sunmuş olduğu "Notification" olayı mevcuttur. Delphi XE5 ile bu işlemi Embarcadero bizlere component tadında sunmuş ve işlerimizi kolaylaştırmıştır. Fakat bence unuttular veya yetiştiremediler şöyle birşey var ki uygulama kapalı olduğu zamanda bu componentin çalışmaması başta bizleri hayal kırıklığına uğratmıştı.

"Brian Long" adlı geliştiricinin bloğunu inceleyenler bu kişinin bir takım java kodlarını delphi proje ile beraber derleyip background servisi yazdığını görmüştür fakat ben bir türlü tam anlamı ile anlayamamış ve o background servisi ile uygulamamdaki Notification componentini tetikleyememiştim.

Embarcadero XE6 sürümü ile bize birtakım componentler daha sunmuştur "BAAS Client" grubu altındaki bu componentler bizlere biraz önce bahsettiğim notification olayını Kinvey.com(Android) veya Parse.com(IOS) aracılığı ile hiç uğraşmadan kolay bir şekilde tetikliyebilmemizi sağlamaktadır.
Bu işlemide Google android mesaj servisi sayesinde yapmaktadır.

İşin kısası: Masaüstündeki exeden mesajınızı ve başlığını yazıyorsunuz Mobil cihazınıza bildirim olarak düşüyor :)

Neden bu kadar şeyi açıklama gereği duydum bende bilmiyorum fakat parmaklar yazdı derler ya o oldu işte.

Projemize ilk önce "Kinvey.com" da üyelik aldığınızı varsayarak başlıyorum. Daha bunu yapmayanlar için biraz önce yazdığım makaleden yararlanabilirler
Linki: http://brsatalay.blogspot.com.tr/2014/08/kinveycom-uyelik-alma-ve-kullanc.html


Gerekli Componentleri aşağıdaki resimde görebilirsiniz.



Öncekle 1 şey yaptırmak istiyorum tabi tercihe kalmıs KinveyProviderin aktif olayını istediğiniz gibide yapabilirsiniz ben checkboxun click olayı ile bağlamak istiyorum.

Toolbardan "View" sekmesine tıklayınız ve açılan menüden "LiveBindings Designer"i açınız aşağıda bir bölüm açıldıgını göreceksiniz.

Bu bölümde yapmanız gereken tek birşey var Chekbox'un altındaki "IsChecked" yazan yeri mouse ile tutup "PushEvents" ın Active yazan yerinin üstüne bırakmanız yani arada bir köprü(link) oluşturacas ki entegre calıssın.

Şimdi bu ekrani  kapatabilirsiniz.

"PushEvents" componentinin  "AutoActive" özelliğini false yapalım ki bu checkboxla aktifleştirelim



Ekranda gördüğünüz resimdeki KinveyProvider componentinin bazı ayarları vardır sıradaki işlemimiz önceki konularda oluşturdugumuz hesaplar ve kodları bu providere tanımlamak.

GCMAppOD = http://brsatalay.blogspot.com.tr/2014/08/google-messaging-service-ayarlamalar.html
Bu linkteki  2. resimdeki "Project Number"

AppKey, AppSecret, MasterSecret = Kinvey.com girişinde sağ alta mevcuttur

Örnek


Username, Password = http://brsatalay.blogspot.com.tr/2014/08/kinveycom-uyelik-alma-ve-kullanc.html adresindeki konuda oluşturduğumuz kullanıcıdır.


Resimdeki gibi Atamaları yapınız




Evet sıradaki atamaları bitirdiğimize göre sıradaki işlemimiz bu servisin yayınladığı mesajı yakalamaktır.

Java kodlarında olsa bir yığın kod yazmamız gerekecekti fakat işte delphiyi bu sebeble seviyorum bizim için zaman kaybetmememiz için standart kodları kendi hallediyor.

Evet olayı bölmeden devam..

"PushEvents" componentinin Event sekmesine gelerek sırayla eventlerimizi tanımlayalım.

procedure TMainScreen.PushEventsDeviceTokenRequestFailed(Sender: TObject; 
const AErrorMessage: string); 
begin //DeviceTokenRequestFailed Eventi hata anında tetiklenir.
  Memo1.Lines.Add('Hata Var!');
  BildirimMemo.Lines.Add(AErrorMessage);//Bu değişken sayesinde dönen hata mesajını yakalayabilirsiniz.
  BildirimMemo.Lines.Add('');
end;

procedure TMainScreen.PushEventsPushReceived(Sender: TObject; 
const AData: TPushData);
begin//Sorunsuz iletişim anında burası tetiklenir.
 BildirimGonder(AData.Message);//Bu değişkene Kinvey.com adresinden gönderdiğiniz mesaj gelecektir.
end;

procedure TMainScreen.BildirimGonder(T: String);
var
  Notification: TNotification;
begin
  if NotificationCenter.Supported then
  begin
    Notification := NotificationCenter.CreateNotification;
    try
      Notification.Name := 'Mesaj Başlığı';
      Notification.AlertBody := T;
      Notification.FireDate := Now;
      NotificationCenter.ScheduleNotification(Notification);
    finally
      Notification.DisposeOf;
    end;
  end
end;


Evet kod kısmımız  *.pas dosyası içerisinde bu kadar sorabilirsiniz "BildirimGonder" proceduresini neden tanımladın sebebi şu:

Uygulama kapalıyken bildirim sekmesine ileti düşer fakat uygulama açıkken herhangi bir "Notification" algısı çalışmadığı için bu işlemi manuel olarak yapmamız gerekmektedir.

Sıradaki işlemimizde "AndroidManifest.template.xml" içerisine uygulama izinleri ve servis ayarları gibi atamaları yapacağız.

"AndroidManifest.template.xml" dosyasını açıyoruz ve "<%uses-permisson%>" metini bulup altına biraz yer açıyoruz ki şu kodları yapıştırabilelim..


<!-- GCM connects to Google Services. -->

    <uses-permission android:name="android.permission.INTERNET" />



    <!-- GCM requires a Google account. -->

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />



    <!-- Keeps the processor from sleeping when a message is received. -->

    <uses-permission android:name="android.permission.WAKE_LOCK" />



    <!--

     Creates a custom permission so only this app can receive its messages.



     NOTE: the permission *must* be called PACKAGE.permission.C2D_MESSAGE,

     where PACKAGE is the application's package name.

    -->

    <permission android:name="%package%.permission.C2D_MESSAGE"

    android:protectionLevel="signature" />

    <uses-permission android:name="%package%.permission.C2D_MESSAGE" />



    <!-- This app has permission to register and receive data message. -->

    <uses-permission

    android:name="com.google.android.c2dm.permission.RECEIVE" />



Nedir bu kodlar derseniz permission yazısından anlayabileceğiniz gibi kullanacağımız işlemlerin izinleridir bu şekil manuel ayarlamak yerine Delphi içerisinden seçerekte atayabilirsiniz tercih size kalmış.


Şimdi biraz aşağılardaki

</intent-filter>

        </activity>


kodları bulun ve hemen altına şu kodları yapıştırın.

<receiver

      android:name="com.embarcadero.gcm.notifications.GCMNotification" android:exported="true"

      android:permission="com.google.android.c2dm.permission.SEND" >

        <intent-filter>

          <action android:name="com.google.android.c2dm.intent.RECEIVE" />

          <category android:name="%package%" />

        </intent-filter>

      </receiver>



Bu kodlar yanlış anlamadıysam google messaj servisinden gelen yayını dinliyor

Son olarak şu kodu ekleyiniz.

<service android:name="com.embarcadero.gcm.notifications.GCMIntentService" />


Sıradaki ve son işlemimiz Mesajımızı göndermektir :)

Bu işlem için Kinvey.com'a giriyoruz ve resimdeki adımları izleyerek Mesaj gönderme ekranına geliyoruz.



Aşağıda gördüğünüz yerdeki yazı alanına istediğinizi  yazarak uygulamanızın kapalı oldugu cihaza notification bildirimi gönderebilirsiniz.



Makalelerimi takip ettiğiniz için teşekkürler. Pek takip eden olduğunu var saymıyorum ama ilgi gösterilirse bu notification gönderme işlemini masaüstü bilgisayardan nasıl gönderildiği ile ilgili yazı yazabilirim isteğe bağlı..

Bu resimde gönderdiğimiz metni görebilirsiniz :)