Firebase ile Push Notification Gönderme

Merhaba, bu yazımda Firebase Cloud Messaging üzerinden anlık bildirim göndermeyi anlatacağım. Önceden Android veya iOS projesi geliştirirken anlık bildirime ihtiyaç duyduğumuzda Google Cloud Messaging kullanarak işlemlerimizi gerçekleştiriyorduk. Ancak Google bir çok özelliği tek çatı altında Firebase bünyesine kattığını I/O 2016’da duyurdu ve GCM’in bir sonraki versiyonu FCM doğmuş oldu.

Bu yazıda Firebase Console kullanmadan kendi sunucumuzda hazırlayacağımız küçük bir test script’i ile kullanımı öğreneceğiz. Çünkü Firebase Console kullanım açısından çok seçenek sunmuyor ve çoğu zaman Server-to-Server iletişime ihtiyaç duyulduğu için bildirim gönderme kısmını bizim yapmamız daha uygun.

Her ne kadar Firebase “Backend” işleri bize bırakın siz rahatça kodlamanızı yapın desede büyük-küçük işletmelerin ürünlerinin verilerini depolamak(belkide daha sonra kullanmak) için güzel bir yöntem, Google’ı tebrik ediyorum(!)

Adım 1 – Bu makale için bir senaryo

Önce makalemizde kullanacağımız bir senaryo oluşturalım. Kullanıcı bizim uygulamamızı açtığında bir istek gönderilecek ve “Token” alınacak. Bu token değerini sunucumuzdaki veritabanına kaydedeceğiz. Ardından sunucumuzda test için bir PHP script yazarak kayıtlı kullanıcılara bildirim göndereceğiz. Hemen başlayalım..

Adım 2 – Projemizi Firebase için ayarlayalım

console.firebase.google.com adresine girelim ve yeni proje oluşturalım.

firebase1

Projeyi oluşturduktan sonra karşımıza çıkan seçeneklerden “Add Firebase to your Android app” seçeneğini seçelim.

firebase2

Buraya uygulamamızın paket adını girelim. Örneğin bende “com.serkancay.fcm-test”

firebase2

“Add App” dediğinizde bir konfigürasyon dosyasını projenize eklemenizi söyleyecek. Bunu şimdilik “Continue” diyerek geçelim.

Son adımda gradle dosyaları için ayarları yapmamız isteniyor. Proje düzeyindeki gradle dosyasında “Dependencies” içine aşağıdaki tanımlamayı yapıştırın.

firebase2
Daha sonra uygulama düzeyindeki gradle dosyasına aşağıdaki tanımlamayı yapıştırın.

Ayrıca “Dependencies” içine kullanacağımız kütüphaneleride tanımlayın.

firebase2

Şimdi projemize “google-services.json” ayar dosyasını yükleyelim. Tekrar Firebase Console’a gidelim ve “Finish” diyerek tamamlayalım. Sol üstten proje adının yanındaki çarka tıklayıp “Project Settings”e gidelim. Biraz altta “google-services.json” dosyasını göreceksiniz bunu indirin ve uygulamanızın içinde “app” klasörüne kopyalayın. Bu süreçten sonra “Sync Now” diyerek projemizi FCM için ayarlamış bulunmaktayız.

Adım 3 – Manifest ayarları

Projemize 2 servis ekleyeceğiz birisi sunucudan mesaj yolladığımızda bunu kullanıcıya bildirim olarak gösterecek olan servis diğeri kullanıcıyı mesaj almak için kaydedecek olan servis.

AndroidManifest.xml dosyasını açın ve Internet izni vererek aşağıdaki servisleri “Application” etiketi içerisinde tanımlayın. Burada servisler hatalı gösterilecek çünkü henüz sınıf açıp kodlarımızı yazmadık.

Adım 4 – Servisler

Projemizin Java kısmında 2 sınıf açalım. FirebaseMessagingService.java ve FirebaseInstanceIDService.java

Bunlar az önce Manifest dosyasında tanımladığımız servislerin sınıflarıdır. Burada Override edilen onMessageReceived(…) metodu sunucumuzdan mesaj attığımızda istemci tarafta(Anroid uygulama) çağırılan fonksiyondur. Biz burada showNotification(…) metodu ile aldığımız mesajı bildirim olarak göstereceğiz.

Diğer sınıfımız olan FirebaseInstanceIDService.java sayesinde kullanıcının Token ID’sini alacağız. Bu id değeri önemlidir. Sunucu tarafında kullanıcılara Push bildirim gönderme işi bu id üzerinden yapılmaktadır.
Bu sınıfta dikkat etmemiz gereken metod onTokenRefresh(…) metodudur. Bu eğer kullanıcıya Token ID verilmemişse bir kez çağırılır. Biz burada verilen id değerini sunucumuza kaydedeceğiz.
registerToken(…) metodu Token ID değerini alıp sunucuya kaydediyor.

Adım 5 – Sunucu Tarafı
Sunucumuzda, gönderilen Token ID değerini “users” tablosuna kaydeden bir register.php servisi ve bildirim gönderecek olan sendNotification.php servisi vardır.
Önce MySQL tablomuzu oluşturalım. Phpmyadmin ile “fcm_test” adında bir veritabanı oluşturdum. Aşağıdaki sorgu ile ID ve Token ID değerlerini tutacak olan “users” tablosunu oluşturuyorum.

Şimdi bu veritabanı ile istemci arasında veri akışı sağlayacak olan register.php servisimizi yazalım.

Şimdi kullanıcılara bildirim ile mesaj göndereceğimiz PHP servisimizi yazalım: sendNotification.php
Bu serviste Authorization:key kısmına kendi değerinizi gireceksiniz. Firebase Console’a gidin, projenizi seçin ve ayarlar kısmından “Cloud Messaging” sekmesine gidin. Buradaki server key değerini aşağıdaki kodda ilgili yere yapıştırın.
*Servisimiz http://localhost:8080/fcm_test/sendNotification.php adresine girdiğimizde kayıtlı telefonlara bildirim gönderecek.

Adım 6 – Son Ayarlamalar
Şimdi kullanıcımızı MainActivity içinde FCM servisimize kaydedelim.
Aşağıdaki kodları onCreate(…) metodu içerisine ekleyin.

Adım 7 – Sonuç
Şimdi uygulamamızı Google Play Service yüklü olan bir Emülatör ya da fiziksel cihaza yükleyelim.
Uygulamayı fiziksel cihazda çalıştırıp loglara baktığımızda Token ID’nin verilmiş olduğunu göreceğiz.
Ayrıca Phpmyadmin yardımıyla veritabanımıza bakacak olursak Token ID değerimiz burada kayıtlı olacaktır.
Şimdi tarayıcımızdan http://localhost:8080/fcm_test/sendNotification.php çalıştıralım ve sonuç:

device-2016-08-15-180302
Bu örneğimiz Firebase ile bildirim göndermeyi anlamanız için son derece basit bir örnektir. İhtiyacınıza göre Token ID değerini kullanarak değişik kullanıcılara bildirim gönderebilirsiniz.

Makalede anlatılan projenin tüm kodlarına bu adresten ulaşabilirsiniz.

17 Comments

  1. enis

    Hocam anlatımınız için çok teşekkürler.
    Bildiğim kadarı ile Firebase’nin kendi arayüzünde tüm kullanıcılara mesaj gönderme kısmı var. Burda sunucu tarafında istediğimiz aralıklarla bildirim gönderebiliriz tabii. Avantajı orada sanırım.
    Benim sormak istediğim kişiye özel bildirim atmak istesek, gelen token değeri ile beraber kullanıcının telefon numarasını mı çekmeliyiz? Veya nasıl bir yöntem izlemeliyiz.

    Teşekkürler.

    • Serkan Çay Serkan Çay

      Evet, bu yöntemle dilediğiniz şekilde bildirim gönderebilirsiniz.
      Kişiye özel bildirim atma olayı tamamen sizin kullanıcıyı nasıl tanımladığınızla alakalı.
      Şöyle bir örnek vereyim:
      Kullanıcı uygulamaya girdiğinde adını girmesini istersiniz ve veritabanına token değerini birlikte kaydedersiniz. Bu sayede sunucuda hazırlayacağınız bir arama script’i ile istediğiniz kişiye bildirim gönderebilirsiniz. Bu sadece bir örnek. Burada isim değilde kullanıcının id’side ayırt edici özellik olabilir.

  2. enis

    Serkan Hocam ayrıca kodu çalıştırmak istediğimde bu hatayı alıyorum.
    java.lang.IncompatibleClassChangeError: android.support.v4.content.ContextCompat

    at com.google.firebase.iid.zzg.zzeC(Unknown Source).
    .
    .
    .

  3. basic

    Hocam merhaba,
    Send kısmını çalıştırdığımda şöyle bir hata alıyorum;

    The request’s Authentification (Server-) Key contained an invalid or malformed FCM-Token (a.k.a. IID-Token).

    Error 401

    • basic

      Hatayı çözmüş bulunmaktayım teşekkürler tutorial için normalde türkçe yayın takip etmem ama denk geldiniz. anlatım gayet başarılı olmuş. teşekkür ederim 🙂

  4. Faruk

    Bir diğer sorum ise ben tek bir kullanıcıya mesaj göndermek istiyorum php ile. Kullanıcının token kodunu aldım fakat tek kişiye nasıl göndereceğimi bulamadım.

  5. melike

    Unauthorized
    Error 401

    hatası alıyorum nedeni ne olabilir
    web api keyi Authorization:key’e yapıştırdım.
    sonra cloud mesage tabı altında server key’i koydum bu seferde registration_id (token boş olamaz hatası çıktı) bu token nedir? telefonun tokeni nasıl elde edilir

  6. Mesut

    Merhaba Çok güzel anlatım teşekkürler.
    Bi sorum olacak peki Database her yeni kayıtta kullanıcıları nasıl bilgilendireceğim.
    yani sendnotification.php dosyasının otomatik tetiklenmesi nasıl olacak

  7. Korhan

    Bir sorum olacaktı , bildirim gönderme limiti var mıdır free hesapta ve varsa bu günlük x kadar limit mi yoksa aynı anda sadece x kadar aygıta bildirim göndermek üzerine midir ? Bilgi verebilirseniz çok memnun olurum.Teşekkürler.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir