Android Firebase Cloud Messaging ile Push Notification Göndermek

Merhaba Arkadaşlar,
mobilhanem.com üzerinden anlattığımız/yayınladığımız android uygulama geliştirme derslerine Firebase Cloud Messaging ile devam ediyoruz. Firebase Cloud Messaging yani FCM , Google Cloud Messaging push servisinin yeni versiyonudur. Google yeni uygulamalara ve GCM kullanan uygulamalara Firebase kullanılması yönünde tavsiyede bulunmaktadır.Google Cloud Messaging sayfasına girdiğinizde sayfanın üstünde bu uyarıyı görebilirsiniz.

Google Cloud Messaging warning

Firebase Cloud Messaging

Gelelim FCM ‘i uygulamamıza nasıl entegre edeceğimize. Ben tüm adımları detaylı bir biçimde anlatmaya çalışacağım.Dolayısıyla uzun bir yazı olacaktır. Öncelikle bu linke tıklayarak Firebase konsolumuza giriyoruz. Gmail hesabımız ile login oluyoruz.

Firebase Konsol Ayarları

Firebase Create project

 

 

Sonra karşımıza çıkan ekranda Create New Project butonuna tıklıyoruz.

 

 

firebase create

 

 

 

Açılan popupta  projemize isim veriyor  ülkemizi seçiyoruz ve Create Project butonu ile devam ediyoruz.

 

 

 

 

firebase notifications

 

 

 

Açılan sayfada farklı farklı firebase servisleri var. Biz Notifications olanı seçiyor ve Get Started Linkine tıklıyoruz.

 

 

 

 

 

Firebase notifications

 

 

Android iconuna tıklayarak devam ediyoruz.

 

 

Firabase notification

 

Açılan popupta ilk alana packagename alanına oluşturduğumuz uygulamanın package name adını giriyor ,ikinci alanı boş bırakıyor ve ADD APP diyerek devam ediyoruz.

 

 

 

 

firebase push notification

 

 

 

Otomatik olarak bilgisayarımız inen google-services.json dosyamızı Android Projemizde nereye eklememiz gerektiğini göstermektedir. Continue diyerek devam ediyoruz.

 

 

 

firebase gradle ayarları

 

 

 

Build.gradle’da yapmamız gereken değişiklikleri gösteriyor. Burda bizden gradle dosyamıza eklememiz gereken kodları gösteriyor.

 

 

 

Android Ayarları

Öncelikle yukarıdaki adımları izlerken otomatik olarak inen google-services.json dosyamızı buluyoruz. Bu dosyayı projemizin bulunduğu klasörde app klasörünün içine yerleştiriyoruz. Aksi takdirde google-services.json dosyasını bulamadım hatası alıyoruz. Yukarıdaki resimlerde zaten bu adımı anlatıyor. Sonrasında uygulamamızı refresh ediyoruz.

android project viewer

 

 

Eğer Android Studio’da  google-services.json klasörünü eklemiş olmamıza rağmen dizinde gözükmüyorsa Project viewer’ımızı değiştiriyoruz. Ve sadece Project olanı seçiyoruz.

 

 

 

Sonra build.gradle dosyamızı açıp bize söylediği scriptleri ekliyoruz. Öncelikle Projenin root dizininde bulunan build.gradle’mızı açıyoruz(Yanında Project:ProjeAdınız yazan build.gradle dosyamız). dependencies içine aşağıdaki gibi düzenleyip “com.google.gms:google-services:3.0.0” satırını ekliyoruz.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0'
        classpath 'com.google.gms:google-services:3.0.0'


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

Sonra app klasörümüz içinde olan build.gradle dosyamızı açıyoruz(yanında Module:app yazan build gradle dosyamız). Bunun içine ise “apply plugin: ‘com.google.gms.google-services'” ve dependencies kısmına ise “compile ‘com.google.firebase:firebase-messaging:9.6.1’
” satırlarını ekleyeceğiz. Aşağıda oluşturduğum gradle dosyasını inceleyebilirsiniz.

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"
    defaultConfig {
        applicationId "com.mobilhanem.firebasepush"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.google.firebase:firebase-messaging:9.6.1' //Firebase Meesaging library

    // Testing dependencies
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2'
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support:support-annotations:24.2.1'

}
apply plugin: 'com.google.gms.google-services'

Not: “apply plugin: ‘com.google.gms.google-services’ ”  bu kodu en alta eklemeye dikkat edelim aksi takdirde MultiDex hatası alacaksınız.

Gradle ayarlarımızı yaptıktan sonra projemizi Sync etmeyi unutmayalım.

Yukarıdaki gibi ayarlarımızı yaptıktan sonra Projemize iki adet Class ekleyeceğiz. Bu classlardan birincisi FirebaseInstanceIdService class’ına extend edecek diğeri ise FirebaseMessagingService class’ına extend edecek. FirebaseInstanceIdService class’ı ve FirebaseMessagingService’i class’ı build.gradle’ın dependencies kısmına eklediğimiz Firebase-messaging kütüphanesi ile projemize dahil oldu. Bu iki class’ta Service Class’lardır. Yani uygulamanın arka planında çalışmaktadırlar. Android Service Class’lar hakkında detaylı bilgiyi bu yazımızdan bulabilirsiniz.

Öncelikle bu service classlarımızı AndroidManifest.xml dosyamıza ekleyelim. İsimlerini Google’n örnek projesinde verdiği gibi MyFirebaseInstanceIdService ve MyFirebaseMessagingService verelim. Ne iş yaptıklarını ise kodlarını paylaştıktan sonra anlatalım 🙂

AndroidManifest.xml  :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mobilhanem.firebasepush">

    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.mobilhanem.firebasepush.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- [START firebase_service] -->
        <service
            android:name=".MyFirebaseMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>
        <!-- [END firebase_service] -->
        <!-- [START firebase_iid_service] -->
        <service
            android:name=".MyFirebaseInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>
        <!-- [END firebase_iid_service] -->
    </application>

</manifest>

 

MyFirebaseInstanceIdService :

package com.mobilhanem.firebasepush;

import android.util.Log;

import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;

/**
 * Created by tahakirca on 29/09/16.
 */

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService{

    private static final String TAG = "MyFirebaseIIDService";
    
    @Override
    public void onTokenRefresh() {
        String token = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Token: " + token);

        sendRegistrationToServer(token);
    }

    private void sendRegistrationToServer(String token) {
        // token'ı servise gönderme işlemlerini bu methodda yapmalısınız
    }

}

Yukarıdaki class bir Service class olduğu için kendisi otomatik çalışacaktır ve içindeki onTokenRefresh() methodu uygulama ilk kurulduğunda , Token oluştuğu zaman otomatik olarak çağırılacaktır. onTokenRefresh() methodu sadece uygulama ilk kurulduğunda çalışmaz. Firebase ,token değiştiği zamanda otomatik olarak bu methodu çağıracaktır.  Log.d kullanarak oluşan Token’ı yazdırdık ayrıca Toast mesajı olarak bastırdık. Bu Token sizin cihazınıza özel bir unique token’dır ve notifikasyon gönderilirken bu token sayesinde sizin cihazınıza notifikasyon gönderilmektedir. Oluşan token’ı  sendRegistrationToServer methoduna gönderdik. Bu methodda oluşmuş olan token’ı servisimize gönderme işlemlerini yapmalısınız. Bunu Asynctask , volley kütüphanesi veya Retrofit kütüphanelerini ile yapabilirsiniz. Bu yapıyı nasıl kuracağınıza siz karar verebilirsiniz.

FirebaseMessagingService :

FirebaseMessagingService kodlarını paylaşmadan önce Firebase Cloud Messaging sistemindeki mesaj tiplerinden bahseledim. Firebase’n 2 farklı tip mesaj çeşidi bulunmaktadır. 1. tip Notification mesaj ve 2.tip Data mesaj olarak ayrılmaktadır.
1-Notification Mesaj
Notification mesaj direk Firebase SDK tarafından handle edilir.Yani uygulamamıza eklediğimiz SDK bizim yerimize notifikasyon gösterme işlemini yapmaktadır. Uygulama arka planda(background) ise notification mesaj geldiği an bizim uygulamamız içinde birşey yapmamıza gerek kalmıyor. Firebase otomatik olarak notification mesajını ve uygulama iconunu göstermekte ve notifikasyona tıklandığında uygulamamız açmaktadır.

Not: Firebase console’dan sadece Notification mesaj gönderilebilmektedir. Data mesaj için Server kullanmanız gerekmektedir. Server’dan hem notification mesaj hemde data mesaj gönderebilirsiniz.Firebase console’dan gönderilen mesajda Notifikasyon sesi çıkmamaktadır.

Server’dan aşağıdaki şekilde notification mesaj gönderebilirsiniz.

{
    "to": "eusmFiZt93g:APA91bEvR-WpbK4A5xwYk3OYKr4-Es .. ", //(Firebase Token)
    "notification": { // notification mesaj tipi
        "body": "Merhaba , Mobilhanem kullanıcıları. Bu bir notifikasyon mesajıdır.", 
        "title": "Mobilhanem.com"
    }
}

2-Data Mesaj

Bu mesaj tipinde ise aşağıdaki paylaşacağım FirebaseMessagingService class’ın onMessageReceived methodu tetiklenmektedir. Yani uygulama ön planda(foreground) veya arka planda(background) olması farketmez. Uygulamada notifikasyon gösterme, notifikasyon sesi,notifikasyon iconu vs.. uygulama içinde uygulamayı yazan kişi tarafından yapılmaktadır. Bu mesaj tipi ile farklı datalarda göndermek mümkündür. Bu dataları onMessageReceived methodu içinde handle edip uygulama içinde istediğimiz gibi kullanabiliriz. Notifikasyon göstermek zorunda da değiliz. İstersek sadece gelen datayı uygulama içinde kullanabiliriz.

Google Cloud Messaging dersimde en çok gelen sorulardan biri notifikasyon olarak gönderilen linki uygulama içinde açtırmaktı. İşte data mesaj tipi bunun kullanımına örnek olabilir.

{
    "to": "eusmFiZt93g:APA91bEvR-WpbK4A5xwYk3OYKr4-Es .. ", //(Firebase Token)

    "data": { // data mesaj tipi
        "site_adi": "Mobilhanem.com", 
        "link": "https://www.mobilhanem.com"
    }
}

onMessageReceived() methodu içinde  remoteMessage.getData() ile gönderilen bilgileri alıp uygulama içinde istediğimiz gibi kullanabiliriz.

Ayrıca yukarıdaki farklı iki mesaj tipini tek bir mesaj içindede aşağıdaki gibi gönderebiliriz.

{
    "to": "eusmFiZt93g:APA91bEvR-WpbK4A5xwYk3OYKr4-Es .. ", //(Firebase Token)
    "notification": { // notification mesaj tipi
        "body": "Merhaba , Mobilhanem kullanıcıları. Bu bir notifikasyon mesajıdır.", 
        "title": "Mobilhanem.com"
    },
    "data": { // data mesaj tipi
        "site_adi": "Mobilhanem.com", 
        "link": "https://www.mobilhanem.com"
    }

}

Gelelim FirebaseMessagingService class’ımıza:

package com.mobilhanem.firebasepush;

/**
 * Created by tahakirca on 29/09/16.
 */
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class MyFirebaseMessagingService extends FirebaseMessagingService  {

    private static final String TAG = "MyFirebaseMsgService";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        if (remoteMessage.getData().size() > 0) { // Data mesajı içeriyor mu
            //Uygulama arkaplanda veya ön planda olması farketmez. Her zaman çağırılacaktır.
            //Gelen içerik json formatındadır.
            Log.d(TAG, "Mesaj data içeriği: " + remoteMessage.getData());
            
            //Json formatındaki datayı parse edip kullanabiliriz. Biz direk datayı Push Notification olarak bastırıyoruz

            sendNotification("Mobilhanem.com",""+remoteMessage.getData());

        }

        if (remoteMessage.getNotification() != null) { //Notification mesajı içeriyor mu
            //Uygulama arkaplanda ise burası çağrılmaz.Ön planda ise notification mesajı geldiğinde çağırılır
            //getBody() ile mesaj içeriği
            //getTitle() ile mesaj başlığı
            Log.d(TAG, "Mesaj Notification Başlığı: " + remoteMessage.getNotification().getTitle() +" "+"Mesaj Notification İçeriği: " + remoteMessage.getNotification().getBody() );

            //Gelen içeriğe göre notifikasyon bildiriminde bulunma
            sendNotification(remoteMessage.getNotification().getTitle(),remoteMessage.getNotification().getBody());
        }

    }

    private void sendNotification(String messageTitle,String messageBody) {

        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        long[] pattern = {500,500,500,500};//Titreşim ayarı

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setVibrate(pattern)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        try {
            Uri alarmSound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE
                    + "://" + this.getPackageName() + "/raw/notification");
            Ringtone r = RingtoneManager.getRingtone(this, alarmSound);
            r.play();
        } catch (Exception e) {
            e.printStackTrace();
        }

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

Evet arkadaşlar android ayarları bukadar. Gelelim Notifikasyon nasıl göndereceğimize:

Firebase Panel Kullanarak Notifikasyon Gönderme

Firebase Cloud Messaging ile gelen yeniliklerden biride Firebase paneli kullanarak push notification atabilmemiz. Yukarıda da belirttiğim gibi Firebase panel kullanarak sadece Notification tipinde mesaj gönderebilirsiniz.Uygulama arka planda ise Firebase SDK kendisi notifikasyon çıkarmaktadır. Eğer ön planda ise uygulama onMessageReceived() methodu içinde kendimiz handle edip notifikasyon işlemlerini kendimiz yapabiliriz.

https://console.firebase.google.com/?hl=tr adresine girerek oluşturduğumuz uygulamayı seçiyoruz. Sol taraftaki menüden Notifications kısmını seçip açılan sayfadan New Message diyerek aşağıdaki sayfayı açıyoruz ve aşağıdaki şekilde bilgileri doldurduktan sonra SEND MESSAGE ile göndere tıklıyoruz.

firebase panel

Böylelikle telefonunda uygulamamız kurulu olan cihazlara notification tipinde notifikasyonlarımızı ServerSide olmadan göndermiş oluyoruz.

Server Side Kullanarak Notifikasyon Göndermek

Server Side kullanarak hem notification tipinde hemde data tipinde notifikasyonlar gönderebiliriz.

Önce Server Side’dan notifikasyon göndermemiz için gerekli olan Web API Key’imizi Firebase konsolundan almamız gerekiyor.https://console.firebase.google.com/?hl=tr adresine girerek oluşturduğumuz uygulamayı seçiyoruz.

firebase konsol project setting

 

 

Sonra sol üstteki uygulama adımızın yanında bulunan ayarlar iconuna tıklıyor ve Project settings’e tıklıyoruz.

 

Firebase web api key

 

Açılan sayfada Web API Key karşısında bulunan uzun string bizim API key’imiz oluyor.

 

 

Gelelim PHP’den Notifikasyon göndermeye:

        $firebase_url = 'https://fcm.googleapis.com/fcm/send';
		
	$fields = array(
            'to' => $token, //KULLANICI TOKEN -> Kullanıcı telefonunda oluşan Token
            'notification' => array('title' => 'Mobilhanem.com', 'body' => 'Mobilhanem.com Firebase Push Mesaj'), //Notification tipinde mesaj
            'data' => array('site_adi' => 'Mobilhanem.com','site_linki'=>'https://www.mobilhanem.com') //data tipinde mesaj
        );
 
        $headers = array(
            'Authorization:key=' . SERVER_KEY, //SERVER API KEY -> Konsoldan aldık
            'Content-Type:application/json'
        );		
		$ch = curl_init();
 
        curl_setopt($ch, CURLOPT_URL, $firebase_url); 
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); 
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
    
        $result = curl_exec($ch);
       
        curl_close($ch);

 

Bilgisayarımızın Konsolundan Notifikasyon Göndermek (Curl)

//SERVER_API_KEY -> Firebase konsoldan aldığımız WEB_API_KEY
//USER_TOKEN -> Kullanıcı Push token 

curl -X POST --header "Authorization: key= SERVER_API_KEY" --Header "Content-Type: application/json" https://fcm.googleapis.com/fcm/send -d "{\"to\":\"USER_TOKEN\",\"notification\":{\"body\":\"mobilhanem.com\"} }"


Yukarıdaki satırda notification kısmını data yaparak data tipindede mesajlar gönderebilirsiniz.

Not: Kendi google-services.json dosyanızı dahil etmezseniz çalışmayacaktır.

Firebase Cloud Messaging dersimiz çok uzun oldu fakat Push notification konusu genel olarak biraz daha zor ve uğraştırıcı bir konudur. Umarım sizlere faydası olacaktır bu dersimizin. Sorularınızı konu altından veya sorucevap.mobilhanem.com adresinden sorabilirsiniz.

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.

34

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

94 Yorum

  • Taha bey detaylı ve harika anlatımınız için teşekkür ederim
    ben 2 gündür bu FCM ile uğraşıyorum , bir türlü başarılı olamadım,
    sizin yazınıza denk geldim araştırırken , siz komple projenizi paylaşmışsınız,
    sizin projenizi indirdim ve sadece google.service.json dosyasını ekledim çalıştırdım uygulama çalıştı ancak yine notification alamadım , acaba benim google developer hesabımdamı bir sorun var yada google consol danmı bir ayar yapmam gerekiyor, veya google cloud api simi almam gerekiyor , programsal olarak herşeyi denedim ancak başarılı olamadım , bu konuda yardımınızı rica ediyorum teşekkürler iyi çalışmalar .

    • Öncelikle yorum için teşekkür ederim. Benim kaynak kodu indirip kendi google-services.json dosyanızı dahil ederken paket adını değiştirdiniz mi ? Benim kaynak kodumun paket adı com.mobilhanem.firebasepush . Sende Firrbase consoledan uygulama oluştururken paket adını aynısı mı yaptın ? Yok kendi paket adını yaptıysan kaynak kodun paket adını değiştirmen gerekir.

      • yanlış anlaşılma olmasın sizden aldığım proje için json ürettirdim firebaseden , bir tek onu ekledim , eklerken eski dosyanın üzerine yazayımmı diye sordu yaz dedim hepsi bu , bir nokta ekleyip çıkarmadım başka 🙂

          • şimdi firebase de oluşturduğum projeyi komple sildim firepush diye proje oluşturdum paket adınıda
            “package_name”: “com.mobilhanem.firebasepush” olarak belirledim , hatta adım adım print screen yaptım , ancak malesef yine olmadı , printscreenleri ve projeyi zipleyip size mail atabilirim , eğer yanlışımı bulursanız çok sevinirim burda takılıp kaldım , yardımlarınıza çok ihtiyacım var , tekrardan ilginiz ve alakanız için çok teşekkür ederim.

          • Sizi çok rahatsız ettim kusura bakmayın son bir kaç soru sorup olmazsa google’a yazıcam,
            sizin uygulamanızı normal android studio üzerinden çalıştır diyerek test ettim , acaba apk yaparak real cihazamı yüklemem gerekir ? , siz testleri real cihazdanmı yoksa emulator denmi yaptınız ?
            şimdiden çok teşekkür ederim
            başarılarınızın devamını diliyorum…

          • Est. ne rahatsızlığı. Ben testlerimi gerçek cihazda yaptım. Apk yaparaktan kastınızı anlamadım ama zaten uygulamayı Run ettiğinizde oluşan apk cihazınıza yüklenmektedir. Android Studio ‘da Logcat çıktılarını iyi okumanız gerekmektedir. Orada loglarda bişeyler yakalayabilirsiniz.

          • Değerli Taha , konu eskisede edindiğim tecrübeyi sizinle paylaşmak isterim ,

            Yukarıdaki denemelerimde hep başarısız olma nedenim çok basit bir detaydan kaynaklanıyormuş
            öncelikle bu FirebaseCloudMessaging servisini kullanacak arkadaşların developer hesaplarını açmış olmaları gerekiyor daha sonra developer olması için gereken ücreti yatırmaları gerekiyor , sonrasında ise benim takıldığım yer burasıydı , bir tane uygulama yazıp google playde yayınlamış olması gerekiyor , eğer daha önce bir uygulama yayınlamadı iseniz bu servisten faydalanamıyorsunuz , Google ile uzun yazışmalarımdan sonra ortaya çıkan sonuç bu oldu , bende ilk önce basit bir El feneri uygulaması yazıp hemen yayınladım google playde , sonra senin yukarıda paylaşmış olduğun uygulamayı yeniden test ettiğimde bu sefer çalıştı , kısaca açıklaması bu şekilde , çok uğraştığım için umarım bu bilgi başka arkadaşların hayatlarını kolaylaştırır,

            başarılarınızın devamını diliyorum iyi çalışmalar…

  • Android uygulamamdan otomatik bildirim göndermek istiyorum söyle ki vBulletin siteme mobil uygulama yapacağım ben istiyorum ki siteden bir başkasına özel mesaj atıldığınsa gelen kişiye otomatik olarak bildirim gelsin istiyorum bubi nasıl yapabiliriz

  • Merhabalar elinize sağlık çok başarılı olmuş yazınız. Denedim çalışıyor bunu eclipse nasıl uyarlarız acaba ? yardımcı olursanız sevinirim

  • Merhaba MyFirebaseInstanceIdService dosyasını nereye ekliyoruz klasör yapısında. yardımcı olursanız sevinirim (not yazılımcı değilim) bir de uzantısı java mı oluyor tşk

      • Yazı ve desteğiniz için teşekkürler Taha Bey, Codecanyondan uygulama almıstım onu editliyorum. push bildirimi yok ekleme için de develope çok para istedi:) geri kalan herşeyi hallettim mobilhanem deki değerli yazarlar sağolsun yazıların da çok faydası oldu

        • Yorum için teşekkür ederiz. Örnek projemizi indiripincelersen daha iyi anlayabilirsin mantığını ve ona göre kendi projene dahil edebilirsin.

          • Taha Bey, firebase konsolundan bildirim göndermeyi başardım fakat bildirim iconu beyaz bir kare şeklinde çıktı bende. bu düzeltilebiliyor mu ?

          • Benm uygulamanın iconunu gösteriyor uygulama iconunu değiştirerek orada çıkacak iconu değiştirebilirsiniz.

  • Taha Bey başarılı bir şekilde çalıştırdım kodları. ben sorucevap ta da firebase ile ilgili bir ders hazırlamanızı rica etmiştim, siz de görmezden gelmemişsiniz çok teşekkürler tekrar. benim sorum şöyle; gcm kullanırken cihazların reg_id lerini bir array’ e atıp ‘registration_ids’ => $registatoin_ids, şeklinde toplu olarak bildirim gönderebiliyorduk. henüz firebase için deneyemedim ancak php deki ‘to’ => $token, kısmındaki $token değişkenini gcm deki gibi array olarak yapılandırıp toplu olarak gönderilebiliyor mu notification acaba?

    • Önemli değil işinize yaraması dileğiyle. Evet array koyup göndereceksiniz. Dikkat etmeniz gereken husus tek seferde en fazla 1000 tane notification gönderebilirsiniz.

      • Tekrar merhaba Taha Bey. Firebase de ‘to’ kısmına array koyunca çalışmıyor ve bu kısım string olmalı gibi bir hata dönüyor. eğer birden fazla cihaza notification gönderilmek isteniyorsa GCM de olduğu ‘registration_ids’ => ‘$registrationIds’ şeklinde yazmak gerekiyor php kısmına. benim için sorun teşkil eden diğer bir husus ise onMessageReceived kısmı uygulama background da ise çalışmıyor maalesef. Notification geliyor cihaza fakat gönderdiğim dataları bu kısımda alamıyorum. yaptığım araştırmalar sonuçsuz kaldı. bu konuda eğer sizin bildiğiniz bir çözüm varsa paylaşabilirseniz sevinirim. yazınızda notification sesi çalmadığını söylemişsiniz, bu da ‘notification’ => array(‘title’ => ‘Mobilhanem.com’, ‘body’ => ‘Mobilhanem.com Firebase Push Mesaj’) bu kısma ‘sound’=>’default’ eklenince çözülüyor. araştıran arkadaşlara faydalı olabilir diye tecrübelerimi paylaşmak istedim. kolay gelsin.

    • Diğer konuda olduğu gibi yapabilirsin. Burda Php de nasıl gönderileceğini anlattık diğer konudan da mysql tarafna bakabilirsin. Aynı mantık.

  • Firebase ile ilgili olarak kendi uygulamama entegre etmeye çalışırken aşağıdaki uyarıyı alıyorum nasıl düzeltebileceğim konusunda fikri olan var mı?

    [url=http://hizliresim.com/rEkzVB][img]http://i.hizliresim.com/rEkzVB.png[/img][/url]

    • Biraz araştırdıktan sonra compile ‘com.google.firebase:firebase-messaging:9.2.1’ //Firebase Meesaging library olarak değiştirdim sorunum çözüldü arkadaşlar aynı problemi yaşayanlar firabase sürümünü değiştirip deneyebilir.

  • Notification gönderdiğimde uygulama splash ekrandan açılıp mainActivitye geçiyor ancak ben bildirimi tıklayınca uygulamada tanımladığım başka bir activityden açılmasını istiyorum. “MainActivity” yazan yerleri değiştirip istediğim activity adını yazdım uygulamada denedim ancak yine splash ekranla main den başlıyor. Bu projenin hangi kısımlarında değişiklik yaparsam istediğim activityden açılmasını sağlayabilirim?

    • Dersi iyi okumalısın. Notification mesaj tipinde push gönderirsen ,uygulama arka planda ise firebase kendisi notification çıkarmaktadır. Dolayısıyla bu durumda sen istediğin activity e yönlendiremezsin. Data mesaj tipinde push gönderirsen yapabilirsin istediğini.

  • merhaba, uygulama update oldugunda onMessageReceived calışıyor mu? Calışmıyorsa nasıl call edebiliriz yeni token almak ve eskisini silmek için? teşekkürler.

  • bu kodu uygulama her açıldığında çalıştırmam mümkün mü?
    private void sendRegistrationToServer(String token) {
    // token’ı servise gönderme işlemlerini bu methodda yapmalısınız
    }

    • evet mümkün. Açılan Activity’de aşağıdaki gibi token ı alıp, sunucuya gönderebilirsin.
      String token = FirebaseInstanceId.getInstance().getToken();

  • Merhaba bunları kendi uygulamama uygulayamadım acaba videolu şekilde var olan bir uygulamaya firebase ile bildirim gönderebielcek şekilde düzenlemeyi analtırmısınız

  • Merhaba
    Detaylı açıklamalar için teşekkürler. Sormak istediğim konu , bildirim gönderdiğimiz cihazdan bildiminin okunduğuna dair geri dönüş alabiliyor muyuz (onay- tarih saat gibi) – whatsapp vari birşey. Firebase bunu sağlıyormu yok sa uygulamaya fazladan kod eklememiz gerekiyor mu?

  • Merhaba, firebase ile push notification yapmak istiyorum. Herşeyi gösterdiğiniz gibi ayarladım. Çalıştırdım ve notifikasyon atabiliyorum. Fakat bildirime özel stil vermek istiyorum. Mesela gelen iconu başka bir icon resmiyle değiştirmek gibi. Yada notificationBuilder sınıfının setLargeIcon gibi özelliklerini kullanmak. Fakat kodu yazıp çalıştırıyorum. Hiç bir değişiklik olmuyor. Sanki MyFirebaseMessagingService class’ındaki kodlar çalışmıyor. Notifikasyon ayarlarını başka bir yerden alıyormuş gibi. Kod tarafından title ve body kısmını elle dolduruyorum. Yine konsoldan gönderilen mesajın içeriği geliyor. Uygulamayı sildim tekrar denedim daha sonra fabrika ayarlarına döndüm tekrar denedim olmadı. Yardım edebilir misiniz?

      • Arkadaşlar bunun neden olduğunu ben derste açıkladım. Öncelikle dersi baştan sona okuyunuz. Sonra zaten çözümü göreceksiniz.
        Dersteki 1-Notification Mesaj başlığı altındaki kısım sorunuzun cevabı.

  • taha bey merhaba, push notificationa tıkladıktan sonra activity yada popup açmak istiyorum. data değil mesaj yolladım. bununla alakalı mı?

    Mesela aşağıdaki kodta yeni activity açmak için Doğru yer aşağıdaki kod mu ? MAin activity yerine başka activiyye yönlendiriyorum açılmıyor.

    public void onMessageReceived(RemoteMessage remoteMessage) {
    String title = remoteMessage.getNotification().getTitle();
    String message = remoteMessage.getNotification().getBody();

    Intent intent = new Intent(this, MainActivity.class);

    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    // PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1,
    // intent, PendingIntent.FLAG_UPDATE_CURRENT);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
    notificationBuilder.setContentTitle(title);
    notificationBuilder.setContentText(message);
    notificationBuilder.setSmallIcon(R.mipmap.image);
    notificationBuilder.setAutoCancel(true);
    notificationBuilder.setContentIntent(pendingIntent);
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(0,notificationBuilder.build());

    }

  • Merhaba herşey tamam mesaj atabiliyorum fakat databaseye yeni veri girildiğinde kullanıcıya göre php’nin tetiklenmesini nasıl yapacağım

    • Merhaba Mesut, Php konusu bu dersin konusu değil. Ben bu dersimde Android tarafında Push notiification olayını anlatmaya çalıştım ve test amaçlı Push notification atmayı gösterdim. Php ile gönderimi sormak istiyorsan sorucevap.mobilhanem.com adresinden sorabilirsin.

      • Merhaba Taha Bu konu direk php ile mi alakalı tetikleme işlemi androidden yapılması gerekli değil mi

        • Kullanıcıya göre tetiklemen için kullanıcının bilgilerini alman lazım, Token’ı gönderirken yada kullanıcının bilgilerini gönderirken yanında token’ıda göndereceksin. Yani sadece bu uygulama ile olmaz. Uygulamayı geliştirmen lazım.

          • Kullanıcı Token’ı alıp database kayıt ediyorum onda problem yok. Uygulamayı geliştirmem gerektiğinin farkındayım ama tek takıldığım yer Database yeni kayıt eklendiğinde tetikleme işlemi nasıl olacak. Otomatik yapmam lazım

          • Token’i gönderirken kullanıcı bilgilerinide yanında göndereceksin ve kaydedeceksin. database’e kayıt eklendiğinde neyi tetiklemek istiyorsun anlamadım.

          • Kullanıcı Bilgileri dediğini anlamadım ama ben kullanıcının Token bilgisini ,ad ,soyad gibi bilgilerini kayıt ediyorum.
            Ben şuanda servis ile her 20 saniyede json dosyasında veri kontrolü yapıp veri varsa bildirim verdiriyorum aynı bunun gibi servis gibi olmasını istiyorum
            Bir json dosyam var bunun içinde veri varsa bildirim vermesini istiyorum

          • Bunu php ile yapacaksın. Database kısmında tetikleme veya bir başka işlemi Php ile yapman gerekiyor. Androidden token ile kullanıcı bilgilerini database gönderip kaydettirdiysen gerisi webservice’n işi

          • Teşekkürler Taha bey bu konuda soru-cevap kısmında mı sormam gerekli webservice işin bu kadar iyi değilim

  • herşey güzel çalışıyor fakat, şöyle bir sorun var, bir bildirim atıyoruz bu bildirim ekrana yansıyor peşinden ikinci bildirimi attığımızda eski bildirim kayboluyor yenisi gözüküyor. Yani ekrana sadece bir bildirim yansıyor. 5 bildirim attık diyelim bu beş bildirimin de ekranda gözükmesini nasıl sağlayacağız?

    • intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      bu satırdan olabilir. Bu satırı kaldırın.

  • Merhaba. Paylaşım çok güzel olmuş. Teşekkürler. Ancak php üzerinden gönderme çalışmadı. php sayfasını tarayıcıda açıyorum. Hiç bir bildirim gelmiyor.

  • Merhaba, kullanıcı token bilgilerini android uygulama olmadan kaydedebileceğimiz bir sistem var mı? Fcm dışında başka bir servis de olabilir. Ya da sadece bildirimler için kullanılabilecek bir android uygulaması… Örneğin uygulamayı indiriyorsunuz site bilgilerinizi giriyorsunuz ve uygulama sizi bu sitenin kullanıcılarına ekliyor. Siz de web üzerinden bu kullanıcılara bildirim gönderiyorsunuz. Böyle bir sistem var mı?

  • Merhaba , firebase consoledan yazdığım mesaj emülatore gelmiyor. Emülatorda uygulama kapalıyken, açıkken, arka planda açıkken denedim bir türlü alamadım bildirimi. firebase dökümandaki adımların hepsini yaptım.

  • Merhaba Taha güzel yazı olmuş eline sağlık.
    Tek dikkatimi çeken “Firebase console’dan gönderilen mesajda Notifikasyon sesi çıkmamaktadır.” demişsin ancak gelişmiş ayarlar sekmesinde ses etkin hala getirilebiliyor.

  • Gelelim PHP’den Notifikasyon göndermeye: başlığındaki kodlarla bir php dosyası (örn: push_mesaj.php) oluşturup web sunucusuna yükledim. Daha sonra adres satırına mobil-okul.com/push_mesaj.php yazdığımda, ‘notification’ kısmındaki mesaj bildirim olarak telefonuma mı gelecek?

    • Belirttiğim şekilde yaptığımda hiç bir şey olmuyor. Önce android uygulamayı telefonda çalıştırıyorum. Uygulama çalışıyorken, internet tarayıcı adres satırından (http://mobil-okul.com/push_deneme.php) php sayfasına erişiyorum. Herhangi bir bildirim gelmiyor. Sanırım hata oluşuyor. Kodun son satırına;
      $result = curl_exec($ch);
      curl_close($ch);
      print_r($result); kodunu ekledim.

      Sonuç olarak aşağıdaki ekran çıktısını aldım. Hata nerede?

      Unauthorized

      Error 401

    • Bu arada, Firebase Consol üzerinden bildirim mesajı gönderebiliyorum. Orada bir sıkıntı yok.

  • merhaba uygulama kapalı olduğu zaman ya da kullanıcı kapattığında bildirim gönderdiğimde telefona bildirim gelmiyor. Bununla ilgili bir çözüm var mı?

  • Merhaba dersiniz çok açıklayıcı ve yararlı oldu.
    Tek takıldığım nokta tokenleri serverda kayıt ediyorum fakat token yenileme olduğunda eskisi ile nasıl değiştireceğim yani tokenle birlikte birde kimlik,Id gibi değişmeyecek bişe kayıt etmem gerekir.Bu konudaki öneriniz nedir.
    Birde token değişme sıklığı nedir acaba burda.
    Tekrardan teşekkürler.

  • Öncelikle cok tesekkur ederim. Özel olarak bir kullanıcıya uygulama içinden bir bildirim göndermem mümkün mü ? örnek vericek olursam bir toplantı düzenlendiginde toplantıya katılacak olan kullanıcılara bildirim gitsin , kullanıcılar firebase veri tabanında bir yerde tutuyorum ve her cihazın Token bilgisini tutuyorum . Yani kisilerin sicil bilgisine göre cihazlarına bildirim yapabilir miyim ?

  • Mehaba. tek bir webapi keyi ile hem android hem ios a server side notification gönderilebilir mi?

  • Hocam selamlar, ekran kapalıyken notification bildirimi geldiğinde ekran açılsın istiyorum TIpkı whatsapp bildirimleri gibi. Nasıl yapabilirim acaba?

  • Merhaba. Yeni bir uygulamamız var. Notification göndermek için Firebase notification kullanıyoruz ama tüm kullanıcılara gitmiyor. Mesela 1000 kullanıcının yarısına gitmiş görünüyor. Sebebi ne olabilir?

      • Olabilir tabi ama firebase dashbord’da dünkü etkin kullanıcı sayısı 330 görünüyor. Dün gönderdiğim notification 200 kişiye ulaşmış. Daha önce gönderdiğim 5 notification’dan benim telefonuma sadece bir tanesi geldi. O yüzden sorun olduğunu düşünüyorum.

  • Öncelikle Çok Teşekkür Ederim. Hocam Hakkın Ödenmez. Bir soru sormak istiyorum izninizle. Notification ile mesajı gönderince uygulama açıksa messageTitle girmemişsek gelmiyor. Ama uygulama kapalı iken messageTitle girmemiş olsak bile uygulama adı olarak geliyor. Bunu kontrol etme imkanımız varmı çok teşekkürler

  • Merhaba Taha Bey;
    Makalenizi okudum, çok yararlı olduğunu düşünüyorum. Benim çözemediğim bir durum var. Yardımınızı rica ediyorum. Bir ASP.NET Projem var, Projemin belli bölümlerinden Hedefli Push Notification göndermek istiyorum. ASP.NET projemde notification gönderme classlarımı oluşturdum, veritabanına user-tokenleri içeren bir tablo açtım. Örneğin bir yoklama alındığında sadece gelmeyen öğrencilerin velilerine göndereceğim.
    Android ve IOS projelerim WebView ile çalışıyor. Uygulamayı açtığımızda bizi .net te oluşturduğum bir Login ekranı karşılıyor.
    Firebase token alma işlemine geldiğimde, bunu asp.nette oluşturulmuş olan Login sayfasında mı yapmalıyım yoksa Android device da mı? Token device göre mi oluşuyor, browser’a göre mi?
    Token’i android device da oluşturursam bu token ve kullanıcı bilgisini uzak veritabanına (MSSQL) nasıl kaydedebilirim?
    Not: Proje HTTPS değil.

  • Merhaba,

    Php curl Unauthorized 401 dönüyor. Herşey tamam ancak bir tek bunu çözemedim. Bu konu hakkındaki görüşünüzü alabilir miyim ?

    Teşekkür ederim.

  • Merhaba Taha bey
    Benim php ile yazdığım sistemi webview ile uygulamaya çevirdim. ve php ile tüm kullanıcılara bildirim göndermek istiyorum. sistemim login girişli yani kullanıcı giriş yaptığında cihazın tokenini kullanıcının mysqldeki veritabanına yazsın istiyorum sizin anlattığınız tokeni uygulama içinde gösteriyor bu konuda yardımınızı rica ediyorum teşekkürler iyi çalışmalar .

  • İyi günler ben Http olarak istek yollayıp kayıtlı cihazları,kayıtlı grupların isimlerini veya kayıtlı konuların isimlerini görme şansım varmı?Grup oluşturma,gruba elaman ekleme çıkarma,topic oluşturma işlemlerini post ile yapabiliyorum fakat oluşturduğum bu durumları geri alamıyorum?

  • webview çalışan bir android uygulamada kullanıcı Token değerini nasıl öğrenebilirim ve mysql database ime kayıt edebilirim?

    • Oluşturduğun tokeni webview linkine ekleyerek gönderebilirsin. Nasıl öğrenebilirim kısmı zaten derste anlatılıyor.

      • Merhaba Taha. Üyelik sistemi ile çalışan bir projem var. Bir üye başka bir üyenin yazısını beğendiğinde veya puan aldığında sadece o kişiye, yazın şu kişi tarafından beğenildi veya şu kişi sana 5 puan verdi gibi özel bildirimler gitsin istiyorum. Her üyenin id ve diğer bilgilerini SQL’de tutuyorum. Yalnız hangi cihazın hangi üyeye ait olduğunu ben nasıl anlayabilirim ki o kişiye özel bildirimler gönderebileyim? İlk üye oldukları zaman cihaz bilgisinide mi SQL’e eklemem gerekiyor GCM’de olduğu gibi. Yanıtlarsanız çok sevinirim.

  • hocam ben webview sitemin uygulamasını yapacağım. buna uygulama bildirimi göndermek istiyorum bu anlattığınız olayı yapınca olay bitecekmidir? teşekkürler.

  • Hocam bu yazılar biraz güncellenmesi lazım. Sizden ricam
    Yapmış olduğunuz eğitici anlatım için çok teşekkürler.
    Ben webview ile direk token sunucuya gönderip regid alıyorum.

    Silinen cihazlara boş yere bildirim göndermeyi nasıl öğrenebiliriz.

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?