Android'de Firebase Cloud Messaging istemci uygulaması kurma

FCM istemcileri, Android 5.0 veya sonraki sürümleri çalıştıran ve Google Play Store uygulamasının yüklü olduğu cihazlar ya da Google API'leri ile Android 5.0 çalıştıran 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

Bu bölümde, uygulamanız için diğer Firebase özelliklerini etkinleştirdiyseniz tamamlamış olabileceğiniz görevler ele alınmaktadır. Henüz yapmadıysanız Firebase'i Android projenize ekleyin.

Uygulama manifestinizi düzenleme

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

  • FirebaseMessagingService'ü genişleten bir hizmet. Arka planda çalışan uygulamalarda bildirim almanın ötesinde ileti işleme işlemleri yapmak istiyorsanız bu gereklidir. Ön plandaki uygulamalarda bildirim almak, veri yükü almak, yayın mesajları göndermek vb. 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 rengini 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şturmayı ve kullanmayı tercih ediyorsanız default_notification_channel_id değerini, gösterildiği gibi bildirim kanalı nesnenizin kimliğine ayarlayın. FCM, gelen mesajlar açıkça bir bildirim kanalı belirlemediğinde 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 yeni bir çalışma zamanı izni sunar. Bu durum, Android 13 veya sonraki sürümleri çalıştıran ve FCMbildirimlerini kullanan tüm uygulamaları etkiler.

FCM SDK'sı (23.0.6 veya sonraki sürümler) varsayılan olarak manifest dosyasında tanımlanan POST_NOTIFICATIONS iznine sahiptir. Ancak uygulamanızın, android.permission.POST_NOTIFICATIONS sabit aracılığıyla 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+KTX

// 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, uygulamanın bildirim yayınlamasına izin verirlerse etkinleştirilecek özellikleri kullanıcıya açıklayan bir kullanıcı arayüzü göstermeniz gerekir. Bu kullanıcı arayüzünde, kullanıcıya Tamam ve Hayır teşekkürler düğmeleri gibi kabul veya ret seçenekleri sunulmalıdır. Kullanıcı Tamam'ı seçerse izni doğrudan isteyin. Kullanıcı Hayır, teşekkürler'i seçerse kullanıcının bildirim almadan devam etmesine izin verin.

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

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

Android, uygulamanız ön planda olduğu sürece uygulamanız ilk kez bildirim kanalı oluşturduğunda kullanıcıdan otomatik olarak izin ister. Ancak kanal oluşturma ve izin isteklerinin zamanlaması ile ilgili önemli noktalar 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 kez açılana kadar kullanıcıdan bildirim izni istemez. Bu, uygulamanız açılmadan ve kullanıcı izin vermeden önce alınan tüm bildirimlerin kaybolacağı anlamına gelir.
  • İ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 bildirim kaybı olmaması için uygulamaya bildirim göndermeden önce bildirim kanalları oluşturmalıdır. Daha fazla bilgi için bildirim izniyle ilgili en iyi uygulamalara bakın.

İsteğe bağlı: POST_NOTIFICATIONS iznini kaldırın

FCM SDK'sı varsayılan olarak POST_NOTIFICATIONS iznini içerir. Uygulamanız bildirim mesajları kullanmıyorsa (FCMbildirimler, başka bir SDK veya doğrudan uygulamanız tarafından yayınlanmış olsun) ve uygulamanızın bu izni içermesini istemiyorsanız manifest birleştirme aracının remove işaretçisini kullanarak izni kaldırabilirsiniz. Bu iznin kaldırılmasının yalnızca FCM bildirimlerinin değil, tüm bildirimlerin gösterilmesini engellediğ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 kayıt jetonuna erişme

FCM SDK'sı, uygulamanızın ilk başlatılmasında istemci uygulama örneği için bir kayıt jetonu oluşturur. Tek cihazları hedeflemek veya cihaz grupları oluşturmak istiyorsanız FirebaseMessagingService öğesini genişletip onNewToken öğesini geçersiz kılarak bu jetona erişmeniz gerekir.

Bu bölümde, jetonun nasıl alınacağı ve jetondaki değişikliklerin nasıl izleneceği açıklanmaktadır. Jeton, ilk başlatma işleminden sonra döndürülebileceğinden en son güncellenmiş kayıt jetonunu almanız önemle tavsiye edilir.

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

  • Uygulama yeni bir cihaza geri yüklendiğinde
  • Kullanıcı uygulamayı kaldırır/yeniden yükler
  • Kullanıcı uygulama verilerini temizler.

Mevcut kayıt jetonunu alma

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

Kotlin+KTX

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, her yeni jeton oluşturulduğunda tetiklenir.

Kotlin+KTX

/**
 * 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'ni kontrol etme

Play Hizmetleri SDK'sını kullanan uygulamalar, Google Play Hizmetleri özelliklerine erişmeden önce cihazda uyumlu bir Google Play Hizmetleri APK'sı olup olmadığını her zaman kontrol etmelidir. Bunu iki yerde yapmanız önerilir: ana etkinliğin onCreate() yönteminde ve onResume() yönteminde. onCreate() içindeki kontrol, başarılı bir kontrol olmadan uygulamanın 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 geri dönmesi durumunda kontrolün yine 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

Bir 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 istiyorsanız aşağıdaki meta veri değerlerini AndroidManifest.xml dosyanıza ekleyerek Analytics verilerini toplamayı ve FCM'nin otomatik olarak başlatılmasını 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" />

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

Kotlin+KTX

Firebase.messaging.isAutoInitEnabled = true

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Analytics koleksiyonunu 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.

Sonraki adımlar

İstemci uygulaması kurulduktan sonra Bildirimler derleyicisi ile aşağı akış mesajları göndermeye hazırsınızdır. Bu işlev, indirip çalıştırabileceğiniz ve inceleyebileceğiniz hızlı başlangıç örneğinde gösterilmektedir.

Uygulamanıza daha gelişmiş başka davranışlar eklemek için bir intent filtresi tanımlayabilir ve gelen mesajlara yanıt verecek bir etkinlik uygulayabilirsiniz. Ayrıntılar için uygulama sunucusundan ileti göndermeyle ilgili kılavuzları inceleyin:

Bu özelliklerden yararlanmak için sunucu uygulaması ve sunucu protokollerinin (HTTP veya XMPP) ya da Yönetici Konsolu SDK'sının bir uygulamasına ihtiyacınız olduğunu unutmayın.