Android'de Firebase Cloud Messaging istemci uygulaması kurma

FCM istemcileri, Android 4.4 veya daha sonraki bir sürümünü çalıştıran ve aynı zamanda Google Play Store uygulamasının yüklü olduğu cihazlar ya da Google API'leriyle Android 4.4 çalıştıran bir emülatör gerektirir. Android uygulamalarınızı Google Play Store üzerinden dağıtmanın sınırlı olmadığını 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 hizmetini kapsayan bir hizmet. Arka planda uygulamalarla ilgili bildirim alma dışında herhangi bir mesajı işleme almak istiyorsanız bu gereklidir. Ön planda çalışan uygulamalarda bildirim almak, veri yükü almak, yukarı akış mesajları göndermek vb. için bu hizmetin kapsamını 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 simgesini ve rengini ayarlamak için meta veri öğeleri kullanılır. Gelen mesajlarda simge veya renk açıkça belirlenmediğinde Android 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 ayarlarla bir varsayılan 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 açıkça bir bildirim kanalı ayarlamadığında bu değeri kullanır. Daha fazla bilgi edinmek için Bildirim kanallarını yönetme konusuna bakın.
  • <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ı bildirimi izni isteme

Android 13, bildirim göstermeyle ilgili yeni bir çalışma zamanında istenen izni kullanıma sunuyor. Bu durum, Android 13 veya sonraki bir sürümde çalışan ve FCM bildirimleri kullanan tüm uygulamaları etkiler.

Varsayılan olarak FCM SDK'sı (23.0.6 veya üzeri sürümler), manifest'te tanımlanan POST_NOTIFICATIONS iznini içerir. Bununla birlikte, uygulamanızın android.permission.POST_NOTIFICATIONS sabit değeri 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ında istenen izni 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);
        }
    }
}

Genel olarak kullanıcıya, uygulamanın bildirim yayınlama izni vermesi durumunda etkinleştirilecek özellikleri açıklayan bir kullanıcı arayüzü görüntülemeniz 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 sağlamalıdır. Kullanıcı Tamam'ı seçerse doğrudan izni isteyin. Kullanıcı Hayır, teşekkürler'i seçerse bildirim olmadan devam etmesine izin verin.

Uygulamanızın kullanıcıdan ne zaman POST_NOTIFICATIONS izni istemesi gerektiği hakkında diğer en iyi uygulamalar için Bildirim çalışma zamanı izni bölümüne bakın.

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

Uygulamanız ilk kez bir bildirim kanalı oluşturduğunda Android, uygulama ön planda olduğu sürece kullanıcıdan otomatik olarak izin ister. Ancak kanal oluşturma ve izin isteklerinin zamanlaması konusunda dikkat edilmesi gereken önemli noktalar vardır:

  • Uygulamanız ilk bildirim kanalını arka planda çalışırken oluşturursa (FCM SDK'sı bir FCM bildirimi alırken bunu yapar) Android, bildirimin görüntülenmesine izin vermez ve uygulamanız bir sonraki açılıncaya kadar kullanıcıdan bildirim izni istemez. Bu, uygulamanız açılmadan ve kullanıcı izni kabul etmeden önce alınan tüm bildirimlerin kaybedileceği 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 bildirim izni iletişim kutusunu tetiklemek ve bildirimlerin kaybolmadığından emin olmak için uygulamanızın, uygulamaya herhangi bir bildirim göndermeden önce bildirim kanalları oluşturması gerekir. Daha fazla bilgi için bildirim izniyle ilgili en iyi uygulamalara göz atı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 (FCM bildirimleri, başka bir SDK aracılığıyla veya doğrudan uygulamanız tarafından yayınlananlar aracılığıyla) ve uygulamanızın bu izni içermesini istemiyorsanız manifest birleştirme remove işaretçisini kullanarak bu izni kaldırabilirsiniz. Bu iznin kaldırılmasının yalnızca FCM bildirimlerinin değil, tüm bildirimlerin görüntülenmesini 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

Uygulamanızın ilk başlatılmasında FCM SDK'sı, istemci uygulaması ö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 değerini geçersiz kılarak bu jetona erişmeniz gerekir.

Bu bölümde jetonun nasıl alınacağı ve jeton değişikliklerinin nasıl izleneceği açıklanmaktadır. Jeton ilk başlatma sonrasında döndürülebileceği için 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üklenir
  • Kullanıcı uygulamayı kaldırır/yeniden yükler
  • Kullanıcı, uygulama verilerini temizler.

Geçerli kayıt jetonunu alma

Geçerli jetonu almanız gerektiğinde FirebaseMessaging.getInstance().getToken() komutunu ç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

Yeni bir jeton oluşturulduğunda onNewToken geri çağırma etkinleşir.

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);
}

Aldığınız jetonu uygulama sunucunuza gönderebilir ve tercih ettiğiniz yöntemi kullanarak saklayabilirsiniz.

Google Play Hizmetleri'ni kontrol edin

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 etkinlik onCreate() yöntemi ve onResume() yöntemi. onCreate() içindeki kontrol, başarılı bir kontrol yapılmadan uygulamanın kullanılamamasını sağlar. onResume() kontrolü, kullanıcı geri düğmesi gibi başka bir yolla çalışan uygulamaya geri döndüğünde 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 izin vermek için GoogleApiAvailability.makeGooglePlayServicesAvailable()'i çağırabilir.

Otomatik başlatmayı engelle

FCM kayıt jetonu oluşturulduğunda kitaplık, tanımlayıcıyı ve yapılandırma verilerini Firebase'e yükler. Otomatik jeton oluşturma işlemini engellemeyi tercih ederseniz bu meta veri değerlerini AndroidManifest.xml öğenize ekleyerek Analytics toplamayı ve FCM otomatik başlatma özelliğini (her 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 auto-init'i yeniden etkinleştirmek için bir çalışma zamanı çağrısı 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. Örnek:

setAnalyticsCollectionEnabled(true);

Bu değerler, ayarlandıktan sonra uygulama yeniden başlatma işlemleri sırasında da kalır.

Sonraki adımlar

İstemci uygulaması kurulduktan sonra, Bildirim oluşturucusu ile aşağı akış mesajları göndermeye hazırsınız. Bu işlev, indirebileceğiniz, çalıştırabileceğiniz ve inceleyebileceğiniz hızlı başlangıç örneğinde gösterilmiştir.

Uygulamanıza daha gelişmiş davranışlar eklemek için intent filtresi beyan edebilir ve gelen mesajlara yanıt vermek için bir etkinlik uygulayabilirsiniz. Ayrıntılar için uygulama sunucusundan mesaj göndermeyle ilgili kılavuzlara bakın:

Bu özelliklerden yararlanmak için bir sunucu uygulaması ve sunucu profilleri (HTTP veya XMPP) ya da Yönetici SDK'sı uygulaması gerekir.