Firebase Cloud Messaging'i kullanmaya başlama


Bu hızlı başlangıç kılavuzunda, mesajları güvenilir bir şekilde gönderebilmeniz için Firebase Cloud Messaging özelliğini mobil ve web istemci uygulamalarınızda nasıl ayarlayacağınız açıklanmaktadır. Sunucu ortamları için Sunucu ortamınız ve FCM başlıklı makaleyi inceleyin.

Firebase Cloud Messaging ve Android'i kullanmaya başlama

FCM istemcileri, Android 5.0 veya sonraki sürümlerin yüklü olduğu ve Google Play Store uygulamasının da yüklü olduğu cihazları ya da Google API'leri ile Android 5.0'ın yüklü olduğu bir emülatörü gerektirir. Android uygulamalarınızı Google Play Store üzerinden dağıtmakla sınırlı olmadığınızı unutmayın.

SDK'yı ayarlama

Henüz yapmadıysanız Firebase'i Android projenize ekleyin.

FCM ile en iyi deneyimi elde etmek için projenizde Google Analytics'yi etkinleştirmenizi önemle tavsiye ederiz. Google Analytics, FCM'nin ileti teslim raporlaması için gereklidir.

Uygulama manifestinizi düzenleme

Uygulamanızın manifest dosyasına aşağıdakileri ekleyin:

  • FirebaseMessagingService'ı genişleten bir hizmet. Bu, arka plandaki uygulamalarda bildirim almanın dışında ileti işleme yapmak istiyorsanız gereklidir. Ön plandaki uygulamalarda bildirim almak, veri yükü almak ve daha fazlası için bu hizmeti genişletmeniz gerekir.
  • <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
  • (İsteğe bağlı) Uygulama bileşeninde, varsayılan bildirim simgesi ve rengi ayarlamak için kullanılan meta veri öğeleri. Android, gelen mesajlarda simge veya renk açıkça ayarlanmadığında bu değerleri kullanır.
  • <!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
         See README(https://goo.gl/l4GJaQ) for more. -->
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_stat_ic_notification" />
    <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
         notification message. See README(https://goo.gl/6BKBk7) for more. -->
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />
  • (İsteğe bağlı) Android 8.0 (API düzeyi 26) ve sonraki sürümlerde bildirim kanalları desteklenir ve önerilir. FCM, temel ayarlara sahip varsayılan bir bildirim kanalı sağlar. Kendi varsayılan kanalınızı oluşturmayı ve kullanmayı tercih ederseniz, default_notification_channel_id değerini gösterildiği gibi bildirim kanalı nesnenizin kimliğine ayarlayın. FCM, gelen mesajlar bir bildirim kanalını açıkça ayarlamadığında bu değeri kullanır. Daha fazla bilgi için Bildirim kanallarını yönetme başlıklı makaleyi inceleyin.
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

Android 13 ve sonraki sürümlerde çalışma zamanında bildirim izni isteğinde bulunma

Android 13, bildirim göstermek için yeni bir çalışma zamanı izni sunar. Bu durum, Android 13 veya sonraki sürümlerde çalışan ve FCM bildirimlerini kullanan tüm uygulamaları etkiler.

Varsayılan olarak, FCM SDK'sı (23.0.6 veya sonraki bir sürüm) manifest dosyasında tanımlanan POST_NOTIFICATIONS iznini içerir. Ancak uygulamanızın, android.permission.POST_NOTIFICATIONS sabitini kullanarak bu iznin çalışma zamanı sürümünü de istemesi gerekir. Kullanıcı bu izni verene kadar uygulamanızın bildirim göstermesine izin verilmez.

Yeni çalışma zamanı iznini istemek için:

Kotlin

// Declare the launcher at the top of your Activity/Fragment:
private val requestPermissionLauncher = registerForActivityResult(
    ActivityResultContracts.RequestPermission(),
) { isGranted: Boolean ->
    if (isGranted) {
        // FCM SDK (and your app) can post notifications.
    } else {
        // TODO: Inform user that that your app will not show notifications.
    }
}

private fun askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
            PackageManager.PERMISSION_GRANTED
        ) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
        }
    }
}

Java

// Declare the launcher at the top of your Activity/Fragment:
private final ActivityResultLauncher<String> requestPermissionLauncher =
        registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
            if (isGranted) {
                // FCM SDK (and your app) can post notifications.
            } else {
                // TODO: Inform user that that your app will not show notifications.
            }
        });

private void askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
                PackageManager.PERMISSION_GRANTED) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
        }
    }
}

Genel olarak, kullanıcıya uygulamaya bildirim gönderme izni vermesi durumunda etkinleştirilecek özellikleri açıklayan bir kullanıcı arayüzü göstermeniz gerekir. Bu kullanıcı arayüzü, kullanıcıya Tamam ve Hayır, teşekkürler düğmeleri gibi kabul etme veya reddetme seçenekleri sunmalıdır. Kullanıcı Tamam'ı seçerse doğrudan izin isteğinde bulunun. Kullanıcı Hayır, teşekkürler'i seçerse kullanıcının bildirim almadan devam etmesine izin verin.

Uygulamanızın kullanıcıdan POST_NOTIFICATIONS iznini ne zaman istemesi gerektiğiyle ilgili daha fazla en iyi uygulama için Bildirim çalışma zamanı izni başlıklı bölümü inceleyin.

Android 12L (API düzeyi 32) veya önceki sürümleri hedefleyen uygulamalar için bildirim izinleri

Uygulamanız ön planda olduğu sürece Android, uygulamanız ilk kez bildirim kanalı oluşturduğunda kullanıcıdan otomatik olarak izin ister. Ancak kanal oluşturma ve izin isteklerinin zamanlamasıyla ilgili önemli uyarılar vardır:

  • Uygulamanız arka planda çalışırken ilk bildirim kanalını oluşturursa (FCM SDK'sı, FCM bildirimi alırken bunu yapar) Android, bildirimin gösterilmesine izin vermez ve uygulamanız bir sonraki açılışında bildirim izni için kullanıcıya istem göstermez. Bu durumda, uygulamanız açılmadan ve kullanıcı izni kabul etmeden önce alınan bildirimler kaybolur.
  • İzin istemek için platformun API'lerinden yararlanmak üzere uygulamanızı Android 13'ü veya sonraki sürümleri hedefleyecek şekilde güncellemenizi önemle tavsiye ederiz. Bu mümkün değilse uygulamanız, bildirim izni iletişim kutusunu tetiklemek ve bildirimlerin kaybolmadığından emin olmak için uygulamaya bildirim göndermeden önce bildirim kanalları oluşturmalıdır. Daha fazla bilgi için bildirim izniyle ilgili en iyi uygulamalar konusuna bakın.

İsteğe bağlı: POST_NOTIFICATIONS iznini kaldırma

FCM SDK'sı varsayılan olarak POST_NOTIFICATIONS iznini içerir. Uygulamanız bildirim mesajları kullanmıyorsa (FCM bildirimler, başka bir SDK veya doğrudan uygulamanız tarafından yayınlanan bildirimler aracılığıyla) ve iznin uygulamanıza dahil edilmesini istemiyorsanız manifest birleştiricinin remove işaretini kullanarak izni kaldırabilirsiniz. Bu iznin kaldırılması durumunda yalnızca FCM bildirimlerinin değil, tüm bildirimlerin gösterilmeyeceğini unutmayın. Uygulamanızın manifest dosyasına aşağıdakileri ekleyin:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>

Cihaz kaydı jetonuna erişme

Uygulamanız ilk kez başlatıldığında FCM SDK, istemci uygulaması örneği için bir kayıt jetonu oluşturur. Tek cihazları hedeflemek veya cihaz grupları oluşturmak istiyorsanız FirebaseMessagingService kapsamını genişleterek ve onNewToken öğesini geçersiz kılarak bu jetona erişmeniz gerekir. Jeton, ilk başlatma işleminden sonra döndürülebileceğinden en son güncellenen kayıt jetonunu almanızı önemle tavsiye ederiz.

Kayıt jetonu şu durumlarda değişebilir:

  • Uygulama yeni bir cihazda geri yüklendi
  • Kullanıcı uygulamayı kaldırır/yeniden yüklerse
  • Kullanıcı, uygulama verilerini temizlerse

Mevcut kayıt jetonunu alma

Mevcut jetonu almanız gerektiğinde FirebaseMessaging.getInstance().getToken() işlevini çağırın:

Kotlin

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

Java

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

Jeton oluşturmayı izleme

onNewToken geri çağırma işlevi, yeni bir jeton oluşturulduğunda her zaman tetiklenir.

Kotlin

/**
 * Called if the FCM registration token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the
 * FCM registration token is initially generated so this is where you would retrieve the token.
 */
override fun onNewToken(token: String) {
    Log.d(TAG, "Refreshed token: $token")

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // FCM registration token to your app server.
    sendRegistrationToServer(token)
}

Java

/**
 * There are two scenarios when onNewToken is called:
 * 1) When a new token is generated on initial app startup
 * 2) Whenever an existing token is changed
 * Under #2, there are three scenarios when the existing token is changed:
 * A) App is restored to a new device
 * B) User uninstalls/reinstalls the app
 * C) User clears app data
 */
@Override
public void onNewToken(@NonNull String token) {
    Log.d(TAG, "Refreshed token: " + token);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // FCM registration token to your app server.
    sendRegistrationToServer(token);
}

Jetonu aldıktan sonra uygulama sunucunuza gönderebilir ve tercih ettiğiniz yöntemi kullanarak saklayabilirsiniz.

Google Play Hizmetleri'nin yüklü olup olmadığını kontrol etme

Play Hizmetleri SDK'sını kullanan uygulamalar, Google Play Hizmetleri özelliklerine erişmeden önce cihazda her zaman uyumlu bir Google Play Hizmetleri APK'sı olup olmadığını kontrol etmelidir. Bunu iki yerde yapmanız önerilir: ana etkinliğin onCreate() yönteminde ve onResume() yönteminde. onCreate() işaretli kontrol, uygulamanın başarılı bir kontrol olmadan kullanılamamasını sağlar. onResume() işaretli kutu, kullanıcının çalışan uygulamaya başka bir yolla (ör. geri düğmesiyle) dönmesi durumunda kontrolün yine de yapılmasını sağlar.

Cihazda Google Play Hizmetleri'nin uyumlu bir sürümü yoksa uygulamanız, kullanıcıların Play Store'dan Google Play Hizmetleri'ni indirmesine izin vermek için GoogleApiAvailability.makeGooglePlayServicesAvailable() işlevini çağırabilir.

Otomatik başlatmayı önleme

FCM kayıt jetonu oluşturulduğunda kitaplık, tanımlayıcıyı ve yapılandırma verilerini Firebase'e yükler. Jetonun otomatik olarak oluşturulmasını önlemek isterseniz aşağıdaki meta veri değerlerini AndroidManifest.xml öğenize ekleyerek Analytics toplama ve FCM otomatik başlatma işlemlerini (ikisini de devre dışı bırakmanız gerekir) devre dışı bırakın:

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

FCM otomatik başlatmayı yeniden etkinleştirmek için çalışma zamanı çağrısı yapın:

Kotlin

Firebase.messaging.isAutoInitEnabled = true

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Analytics toplama özelliğini yeniden etkinleştirmek için FirebaseAnalytics sınıfının setAnalyticsCollectionEnabled() yöntemini çağırın. Örneğin:

setAnalyticsCollectionEnabled(true);

Bu değerler, ayarlandıktan sonra uygulama yeniden başlatıldığında da geçerliliğini korur.

Bildirim mesajı gönderme

Android istemcinizin doğru şekilde ayarlandığından emin olmak için aşağıdaki talimatları kullanarak bir test bildirimi mesajı gönderebilirsiniz:

  1. Uygulamayı hedef cihaza yükleyip çalıştırın.
  2. Uygulamanın cihazda arka planda çalıştığından emin olun.
  3. Firebase konsolunda Mesajlaşma sayfasını açın.
  4. Bu ilk mesajınızsa İlk kampanyanızı oluşturun, Firebase Notification mesajları ve ardından Oluştur'u seçin.
  5. Aksi takdirde, Kampanyalar sekmesinde Yeni kampanya'yı ve ardından Bildirimler'i seçin.
  6. Mesaj metnini girin. Diğer tüm alanlar isteğe bağlıdır.
  7. Sağ bölmede Test mesajı gönder'i seçin.
  8. Add an FCM registration token (FCM kayıt jetonu ekle) etiketli alana, bu kılavuzun önceki bir bölümünde aldığınız kayıt jetonunu girin.
  9. Test et'i seçin.

Uygulama arka planda çalışırken hedef istemci cihazı bildirimi almalıdır.

Uygulamanıza ileti teslimi hakkında daha fazla bilgi için FCM raporlama kontrol paneline bakın. Bu kontrol paneli, Apple ve Android cihazlarda gönderilen ve açılan ileti sayısının yanı sıra Android uygulamaları için gösterim (kullanıcılar tarafından görülen bildirimler) verilerini kaydeder.

Sonraki adımlar

İstemci uygulaması kurulduktan sonra kullanıcılarınıza mesaj göndermeye veya onlardan mesaj almaya başlayabilirsiniz: