Android'de bir Firebase Bulut Mesajlaşma istemci uygulaması kurun

FCM istemcileri, Google Play Store uygulamasının da yüklü olduğu Android 4.4 veya üstünü çalıştıran cihazlar veya Google API'ları ile Android 4.4 çalıştıran bir öykünücü gerektirir. Android uygulamalarınızı Google Play Store aracılığıyla dağıtmakla sınırlı olmadığınızı unutmayın.

SDK'yı kurun

Bu bölüm, uygulamanız için diğer Firebase özelliklerini zaten etkinleştirdiyseniz tamamlamış olabileceğiniz görevleri içerir. Henüz yapmadıysanız, Firebase'i Android projenize ekleyin

Uygulama bildiriminizi düzenleyin

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

  • FirebaseMessagingService öğesini genişleten bir hizmet. Arka planda uygulamalarla ilgili bildirim almanın ötesinde herhangi bir mesaj işleme yapmak istiyorsanız bu gereklidir. Ön planlı uygulamalarda bildirim almak, veri yükü almak, yukarı akış 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şeni içinde, varsayılan bir bildirim simgesi ve rengi ayarlamak için meta veri öğeleri. Gelen iletiler açıkça simge veya renk ayarlamadığında 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 üzeri sürümlerde, bildirim kanalları desteklenir ve önerilir. FCM, temel ayarlarla varsayılan bir bildirim kanalı sağlar. Kendi varsayılan kanalınızı oluşturmayı ve kullanmayı tercih ederseniz, gösterildiği gibi default_notification_channel_id öğesini bildirim kanalı nesnenizin kimliğine ayarlayın; FCM, gelen iletiler açıkça bir bildirim kanalı ayarlamadığında bu değeri kullanacaktır. Daha fazla bilgi edinmek için bkz. Bildirim kanallarını yönetme .
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

Android 13+ üzerinde çalışma zamanı bildirim izni iste

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

Varsayılan olarak, FCM SDK'sı (sürüm 23.0.6 veya üstü), bildirimde tanımlanan POST_NOTIFICATIONS iznini içerir. Ancak, uygulamanızın bu iznin çalışma zamanı sürümünü android.permission.POST_NOTIFICATIONS sabiti aracılığıyla da istemesi gerekir. Kullanıcı bu izni verene kadar uygulamanızın bildirim göstermesine izin verilmeyecektir.

Yeni çalışma zamanı 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, uygulamaya bildirim gönderme izni vermeleri durumunda etkinleştirilecek özellikleri açıklayan bir kullanıcı arayüzü göstermelisiniz. Bu kullanıcı arabirimi, kullanıcıya Tamam ve Hayır, teşekkürler düğmeleri gibi kabul etme veya reddetme seçeneklerini sağlamalıdır. Kullanıcı Tamam'ı seçerse, doğrudan izin isteyin. Kullanıcı Hayır, teşekkürler 'i seçerse kullanıcının bildirimler olmadan devam etmesine izin verin.

Uygulamanızın kullanıcıdan POST_NOTIFICATIONS iznini ne zaman istemesi gerektiğine ilişkin daha fazla en iyi uygulama için Bildirim çalışma zamanı iznine bakın.

Android 12L (API seviye 32) veya daha düşük sürümleri hedefleyen uygulamalar için bildirim izinleri

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

  • Uygulamanız arka planda çalışırken ilk bildirim kanalını oluşturursa (FCM SDK'sı bir FCM bildirimi alırken bunu yapar), Android bildirimin görüntülenmesine izin vermez ve bir sonrakine kadar kullanıcıdan bildirim izni istemez. uygulamanızın açıldığı saat. Bu , uygulamanız açılmadan ve kullanıcı izni kabul etmeden önce alınan tüm bildirimlerin kaybolacağı anlamına gelir.
  • İzin istemek için platformun API'lerinden yararlanmak amacıyla uygulamanızı Android 13+ sürümünü hedefleyecek şekilde güncellemenizi kesinlikle öneririz. Bu mümkün değilse, bildirim izni iletişim kutusunu tetiklemek ve hiçbir bildirimin kaybolmadığından emin olmak için uygulamaya herhangi bir bildirim göndermeden önce uygulamanızın bildirim kanalları oluşturması gerekir. Daha fazla bilgi için bildirim izni en iyi uygulamalarına bakın.

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

Varsayılan olarak FCM SDK, POST_NOTIFICATIONS iznini içerir. Uygulamanız bildirim mesajları kullanmıyorsa (ister FCM bildirimleri aracılığıyla, ister başka bir SDK aracılığıyla veya doğrudan uygulamanız tarafından yayınlanmış olsun) ve uygulamanızın izni içermesini istemiyorsanız, manifest birleştirmenin remove işaretçisini kullanarak bunu 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 bildirim dosyasına şunu ekleyin:

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

Cihaz kayıt belirtecine erişin

Uygulamanızın ilk başlangıcında, FCM SDK, istemci uygulama örneği için bir kayıt belirteci oluşturur. Tek cihazları hedeflemek veya cihaz grupları oluşturmak istiyorsanız, FirebaseMessagingService genişleterek ve onNewToken öğesini geçersiz kılarak bu simgeye erişmeniz gerekir.

Bu bölümde belirtecin nasıl alınacağı ve belirteçte yapılan değişikliklerin nasıl izleneceği açıklanmaktadır. Belirteç ilk başlatmadan sonra döndürülebileceğinden, en son güncellenmiş kayıt belirtecini almanız kesinlikle önerilir.

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

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

Geçerli kayıt jetonunu al

Geçerli belirteci almanız gerektiğinde FirebaseMessaging.getInstance().getToken() arayı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();
        }
    });

Belirteç oluşturmayı izleyin

onNewToken geri araması, yeni bir belirteç 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, onu uygulama sunucunuza gönderebilir ve tercih ettiğiniz yöntemi kullanarak saklayabilirsiniz.

Google Play hizmetlerini kontrol edin

Play Hizmetleri SDK'sına dayanan uygulamalar, Google Play hizmetleri özelliklerine erişmeden önce her zaman cihazda 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çindeki kontrol, uygulamanın başarılı bir kontrol olmadan kullanılamayacağını garanti eder. onResume() deki check-in, kullanıcı çalışan uygulamaya geri düğmesi gibi başka yollarla dönerse, kontrolün yine de gerçekleştirilmesini sağlar.

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

Otomatik başlatmayı engelle

Bir FCM kayıt belirteci oluşturulduğunda kitaplık, tanımlayıcıyı ve yapılandırma verilerini Firebase'e yükler. Belirteç otomatik oluşturmayı engellemeyi tercih ederseniz, bu meta veri değerlerini AndroidManifest.xml dosyanıza ekleyerek Analytics toplamayı ve FCM otomatik başlatmayı devre dışı bırakın (her ikisini de devre dışı bırakmalısınız):

<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 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. Örneğin:

setAnalyticsCollectionEnabled(true);

Bu değerler, ayarlandıktan sonra uygulama yeniden başlatmaları boyunca devam eder.

Sonraki adımlar

İstemci uygulaması ayarlandıktan sonra, Bildirim oluşturucu ile aşağı akış mesajları göndermeye hazırsınız. Bu işlevsellik, indirebileceğiniz, çalıştırabileceğiniz ve gözden geçirebileceğiniz hızlı başlangıç ​​örneğinde gösterilmektedir.

Uygulamanıza başka, daha gelişmiş davranışlar eklemek için bir amaç filtresi bildirebilir ve gelen mesajlara yanıt vermek için bir etkinlik uygulayabilirsiniz. Ayrıntılar için, bir uygulama sunucusundan mesaj gönderme kılavuzlarına bakın:

Bu özelliklerden yararlanmak için bir sunucu uygulamasına ve sunucu prokotollerine (HTTP veya XMPP) veya bir Admin SDK uygulamasına ihtiyacınız olacağını unutmayın.