Android uygulamalarında Firebase Cloud Messaging'i kullanmaya başlama

Platform seçin: iOS+ Android Web Flutter Unity C++


Bu kılavuzda, mesajları güvenilir bir şekilde gönderebilmeniz için Android istemci uygulamalarınızda Firebase Cloud Messaging'yı kullanmaya nasıl başlayacağınız açıklanmaktadır.

FCM istemcileri, Google Play Store uygulaması yüklü olan Android 7.0 veya sonraki sürümlerin yüklü olduğu cihazları ya da Google API'leri ile Android 7.0'ın yüklü olduğu bir emülatörü gerektirir. Android uygulamalarınızı yalnızca Google Play Store üzerinden dağıtmak zorunda 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'ı etkinleştirmenizi önemle tavsiye ederiz. Google Analytics, FCM için mesaj teslimi raporlaması için bir gerekliliktir.

Uygulama manifestinizi düzenleme

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

  • FirebaseMessagingService hizmetini genişleten bir hizmet. Arka plandaki uygulamalarda bildirim alma dışında herhangi bir mesaj işleme işlemi yapmak istiyorsanız bu gereklidir. Ön planda çalışan 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 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şturup kullanmayı tercih ederseniz default_notification_channel_id değerini, bildirim kanalı nesnenizin kimliğine ayarlayın. FCM, gelen mesajlar açıkça bir bildirim kanalı 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 isteme

Android 13, bildirimleri göstermek için çalışma zamanında istenen yeni bir izin sunar. Bu değişiklik , Android 13 veya sonraki sürümlerde çalışan ve FCM bildirimleri kullanan tüm uygulamaları etkiler.

Varsayılan olarak FCM SDK'sı (23.0.6 veya sonraki sürümler), 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.

Çalışma zamanında istenen yeni izni talep etmek 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);
        }
    }
}

Genellikle, kullanıcıya uygulamanın bildirim yayınlamasına izin vermesi durumunda etkinleştirilecek özellikleri açıklayan bir kullanıcı arayüzü göstermeniz gerekir. Bu kullanıcı arayüzü, kullanıcıya kabul etme veya reddetme seçenekleri (ör. Tamam ve Hayır, teşekkürler düğmeleri) sunmalıdır. Kullanıcı Tamam'ı seçerse doğrudan izin isteyin. Kullanıcı Hayır, teşekkürler'i seçerse bildirimler olmadan 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ı makaleyi 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 ilk bildirim kanalını arka planda çalışırken oluşturursa (FCM SDK'sı, FCM bildirimi aldığında bunu yapar) Android, bildirimin gösterilmesine izin vermez ve uygulamanız bir sonraki açılışına kadar kullanıcıdan bildirim izni istemez. Bu nedenle, 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'ü ve 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 başlıklı makaleyi inceleyin.

İ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 bildirimleri, başka bir SDK aracılığıyla veya doğrudan uygulamanız tarafından yayınlanan) ve uygulamanızın bu izni içermesini istemiyorsanız manifest birleştiricinin remove işaretçisini kullanarak izni kaldırabilirsiniz. Bu izni kaldırdığınızda yalnızca FCM bildirimlerinin değil, tüm bildirimlerin gösterilmesinin engelleneceğini unutmayın. Uygulamanızın manifest dosyasına aşağıdakileri ekleyin:

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

Firebase Kurulum Kimliği'ne erişme

Uygulamanız ilk kez başlatıldığında FCM SDK'sı uygulama örneğini FCM ile kaydeder ve uygulama örneği için bir tanımlayıcı döndürür. Tekil uygulama örneklerini hedeflemek istiyorsanız FirebaseMessagingService sınıfını genişleterek ve onRegistered() yöntemini geçersiz kılarak bu tanımlayıcıya erişmeniz gerekir. Tanımlayıcı ilk başlatmadan sonra değişebileceğinden, en iyi uygulama olarak en son güncellenen tanımlayıcıyı alın.

Firebase Kurulum Kimliği aracılığıyla kaydı etkinleştirme

Firebase Kurulum Kimliği'ni (FID) kullanarak uygulama örneğinizi FCM ile kaydetmeyi etkinleştirmek için AndroidManifest.xml dosyanıza aşağıdaki meta veri işaretini ekleyin:
<meta-data
    android:name="firebase_messaging_installation_id_enabled"
    android:value="true" />

onRegistered() geri çağırmasını uygulayın

Uygulama örnekleri, FCM ile kaydedildikten sonra Firebase Kurulum Kimliği (FID) kullanılarak hedeflenir. Kayıt sırasında FID'yi almak için onRegistered() geri çağırma işlevini uygulayın. Bir uygulama örneği kaydedildikten sonra FCM SDK'sı, FID değişikliklerini otomatik olarak izler ve bir değişiklik algılandığında geri çağırmayı çağırır. Otomatik başlatma etkinleştirildiğinde FCM SDK'sı, kaydın güncel kalması için FCM arka ucuyla otomatik olarak senkronize olur ve uygulama sunucunuzun mevcut tanımlayıcıya sahip olmasını sağlamak için geri çağırmayı başlatır. FID kaybını veya eski FID'leri önlemek için bu geri çağırma her tetiklendiğinde FID'yi uygulama sunucunuza göndermeniz gerekir.

Kotlin

  /**
   * There are three scenarios when `onRegistered` is called:
   * 1) Every time a manual `register()` call finishes successfully
   * 2) Whenever the FID is changed and the app is re-registered with FCM via the new FID.
   * 3) Automatically on app startup or routine sync when auto-initialization is enabled.
   * Under #2, there are three scenarios when the existing FID is changed:
   * A) App is restored to a new device
   * B) User uninstalls/reinstalls the app
   * C) User clears app data
   */
  override fun onRegistered(installationId: String) {
      Log.d(TAG, "Registered installation ID: $installationId")

      // Send the Firebase Installation ID to your app server.
      sendRegistrationToServer(installationId)
  }
    

Java

  /**
   * There are three scenarios when `onRegistered` is called:
   * 1) Every time a manual `register()` call finishes successfully
   * 2) Whenever the FID is changed and the app is re-registered with FCM via the new FID
   * 3) Automatically on app startup or routine sync when auto-initialization is enabled.
   * Under #2, there are three scenarios when the existing FID is changed:
   * A) App is restored to a new device
   * B) User uninstalls/reinstalls the app
   * C) User clears app data
   */
  @Override
  public void onRegistered(@NonNull String installationId) {
      Log.d(TAG, "Registered installation ID: " + installationId);

      // Send the Firebase Installation ID to your app server.
      sendRegistrationToServer(installationId);
  }
    

Otomatik başlatma devre dışı bırakıldığında manuel olarak kaydetme

Otomatik başlatmayı devre dışı bırakmanız gerekiyorsa FCM SDK'sı, başlangıçta onRegistered() geri çağırma işlevini otomatik olarak senkronize etmez veya tetiklemez. Bildirim izinleri verildikten sonra otomatik başlatmayı yeniden etkinleştirmeniz önemle tavsiye edilir. Daha fazla bilgi edinmek için Otomatik başlatmayı yeniden etkinleştirme bölümünü inceleyin.

Otomatik başlatma devre dışı kalmalıdırsa FirebaseMessaging.getInstance().register() geri çağırması aracılığıyla kayıt ve FID teslimini tetiklemek için uygulama başlatıldığında onRegistered() işlevini çağırın. Bu aramayı, ana Activity öğenizin onCreate() yönteminde yürütebilirsiniz.

Kotlin

  // Trigger manual registration if auto-initialization is turned off.
  // Consider calling this every time the app starts to guarantee sync status.
  FirebaseMessaging.getInstance().register()
      .addOnCompleteListener(this) { task ->
        if (!task.isSuccessful()) {
          // Registration failed. Consider retrying the registration with exponential backoff.
          Log.w(TAG, "Failed to register with Firebase Cloud Messaging", task.exception)
        }
        // Success! The Firebase Installation ID can be used to target messages to this app
        // instance and will be delivered asynchronously to your `onRegistered()` callback.
      }
    

Java

  // Trigger manual registration if auto-initialization is turned off.
  // Consider calling this every time the app starts to guarantee sync status.
  FirebaseMessaging.getInstance().register()
      .addOnCompleteListener(task -> {
        if (!task.isSuccessful()) {
          // Registration failed. Consider retrying the registration with exponential backoff.
          Log.w(TAG, "Failed to register with Firebase Cloud Messaging", task.exception)
        }
        // Success! The Firebase Installation ID can be used to target messages to this app
        // instance and will be delivered asynchronously to your `onRegistered()` callback.
      });
    

FCM kayıt jetonuna erişme (desteği sonlandırıldı)

Uygulamanız ilk kez başlatıldığında FCM SDK'sı, istemci uygulama örneği için bir kayıt jetonu oluşturur. Tek uygulama örneklerini hedeflemek veya cihaz grupları oluşturmak istiyorsanız FirebaseMessagingService öğesini 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 cihaza geri yüklendiğinde
  • Kullanıcı uygulamayı kaldırır/yeniden yüklerse
  • Kullanıcı uygulama verilerini temizlediğinde

Mevcut kayıt jetonunu alma

Mevcut jetonu almanız gerektiğinde FirebaseMessaging.getInstance().getToken() yöntemini ç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şturma işlemini 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 depolayabilirsiniz.

Google Play Hizmetleri'ni kontrol etme

Play Hizmetleri SDK'sını kullanan uygulamalar, Google Play Hizmetleri özelliklerine erişmeden önce her zaman cihazda uyumlu bir Google Play Hizmetleri APK'sı olup olmadığını kontrol etmelidir. Daha fazla bilgi için Google Play Hizmetleri'ni ayarlama başlıklı makaleyi inceleyin. Bunu iki yerde yapmanız önerilir: ana etkinliğin onCreate() yönteminde ve onResume() yönteminde. onCreate() uygulamasındaki kontrol, uygulamanın başarılı bir kontrol olmadan kullanılamamasını sağlar. onResume() içindeki kontrol, kullanıcının çalışan uygulamaya geri düğmesi gibi başka bir yöntemle 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 Google Play Hizmetleri'ni Play Store'dan indirmesine olanak tanımak için GoogleApiAvailability.makeGooglePlayServicesAvailable() işlevini çağırabilir.

Otomatik başlatmayı önleme

FCM kaydı oluşturulduğunda kitaplık, tanımlayıcıyı ve yapılandırma verilerini Firebase'e yükler. Otomatik kaydı önlemek istiyorsanız aşağıdaki meta veri değerlerini AndroidManifest.xml dosyanıza ekleyerek Analytics veri toplamayı ve FCM otomatik başlatmayı devre dışı bırakın (her ikisini de devre dışı bırakmanız gerekir):

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

Otomatik başlatmayı yeniden etkinleştirme

FCM otomatik başlatma özelliğini yeniden etkinleştirmek için bir çalışma zamanı çağrısı yapın:

Kotlin

Firebase.messaging.isAutoInitEnabled = true

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Analytics veri toplamayı 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ılsa bile korunur.

Bildirim mesajı gönderme

Android istemcinizin doğru şekilde ayarlandığından emin olmak için aşağıdaki talimatları uygulayarak test amaçlı bir bildirim 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 DevOps & Engagement (DevOps ve Etkileşim) > Messaging'e (Mesajlaşma) gidin.

  4. Kampanya oluşturun.

    • Bu ilk mesajınızsa:

      1. İlk kampanyanızı oluşturun'u seçin.

      2. Firebase Notification mesajları'nı ve Oluştur'u seçin.

    • Daha önce kampanya oluşturduysanız:

      1. Kampanyalar sekmesinde Yeni kampanya'yı seçin.

      2. Bildirimler'i tıklayın.

  5. Mesaj metnini girin. Diğer tüm alanlar isteğe bağlıdır.

  6. Sağ bölmeden Test mesajı gönder'i seçin.

  7. FCM kayıt jetonu ekle etiketli alana, bu kılavuzun önceki bir bölümünde aldığınız kayıt jetonunu girin.

  8. Test et'i seçin.

Uygulama arka plandayken hedef istemci cihazı bildirimi almalıdır.

Uygulamanıza mesaj teslimi hakkında bilgi edinmek için Firebase konsolunda DevOps ve Etkileşim > Mesajlaşma > Raporlar kontrol paneli'ne gidin. Bu kontrol panelinde, Apple ve Android cihazlarda gönderilen ve açılan mesajların sayısı ile Android uygulamaları için "gösterim" (kullanıcılar tarafından görülen bildirimler) verileri kaydedilir.

Sonraki adımlar

Kurulum adımlarını tamamladıktan sonra Android için FCM'i kullanmaya devam etmek üzere birkaç seçeneğiniz vardır: