Android'de Firebase Cloud Messaging istemci uygulaması kurma

FCM istemcileri, Google Play Store uygulamasının da yüklü olduğu, Android 4.4 veya sonraki sürümünü çalıştıran cihazlara veya Google API'leri ile Android 4.4 çalıştıran bir emülatöre ihtiyaç duyar. Android uygulamalarınızı Google Play Store aracılığıyla dağıtmakla sınırlı olmadığınızı unutmayın.

SDK'yı kurma

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

Uygulama manifestinizi düzenleyin

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

  • FirebaseMessagingService genişleten bir hizmet. Arka planda uygulamalarla ilgili bildirim almanın ötesinde herhangi bir mesaj işleme işlemi yapmak istiyorsanız bu gereklidir. Ön plana çıkan 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 bildirim simgesini ve rengini ayarlamak için meta veri öğeleri. Android, gelen mesajların simgeyi veya rengi açıkça ayarlamadığı durumlarda 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ümlerden itibaren bildirim kanalları desteklenir ve önerilir. FCM, temel ayarlarla birlikte varsayılan bir bildirim kanalı sağlar. Kendi varsayılan kanalınızı oluşturmayı ve kullanmayı tercih ederseniz, default_notification_channel_id gösterildiği gibi bildirim kanalı nesnenizin kimliğine ayarlayın; FCM, gelen mesajların açıkça bir bildirim kanalı ayarlamadığı durumlarda bu değeri kullanacaktı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+ sürümlerinde çalışma zamanı bildirimi izni isteyin

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

Varsayılan olarak, FCM SDK'sı (sürüm 23.0.6 veya üzeri), bildirimde tanımlanan POST_NOTIFICATIONS iznini içerir. Ancak uygulamanızın aynı zamanda android.permission.POST_NOTIFICATIONS sabiti aracılığıyla bu iznin çalışma zamanı sürümünü de istemesi gerekecektir. 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 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 sunmalı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 bildirim 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 düzeyi 32) veya daha düşük sürümleri hedefleyen uygulamalar için bildirim izinleri

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

  • Uygulamanız arka planda çalışırken ilk bildirim kanalını oluşturursa (FCM SDK'nın bir FCM bildirimi alırken yaptığı gibi), Android bildirimin görüntülenmesine izin vermeyecek ve bir sonrakine kadar kullanıcıdan bildirim izni istemeyecektir. uygulamanızın açıldığı zaman. Bu , uygulamanız açılmadan ve kullanıcı izni kabul etmeden önce alınan tüm bildirimlerin kaybolacağı anlamına gelir.
  • İzin istemek amacıyla platformun API'lerinden yararlanmak için 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 kaybolmamasını sağlamak için uygulamaya herhangi bir bildirim göndermeden önce uygulamanızın bildirim kanalları oluşturması gerekir. Daha fazla bilgi için bildirim iznine ilişkin en iyi uygulamalara bakın.

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

Varsayılan olarak FCM SDK'sı POST_NOTIFICATIONS iznini içerir. Uygulamanız bildirim mesajlarını kullanmıyorsa (FCM bildirimleri yoluyla, başka bir SDK aracılığıyla veya doğrudan uygulamanız tarafından gönderilen) ve uygulamanızın bu izni içermesini istemiyorsanız, manifest birleştirmenin remove işaretçisini kullanarak onu 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. Aşağıdakileri uygulamanızın manifest dosyasına ekleyin:

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

Cihaz kayıt jetonuna erişme

Uygulamanızın ilk başlangıcında FCM SDK, istemci uygulaması ö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 geçersiz kılarak bu belirtece 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şlatmanın ardından döndürülebileceğinden, en son güncellenen kayıt belirtecini 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 alın

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

Belirteç oluşturmayı izleyin

onNewToken geri çağrısı, 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);
}

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

Google Play hizmetlerini kontrol edin

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. Bunu iki yerde yapmanız önerilir: ana etkinliğin onCreate() yönteminde ve onResume() yönteminde. onCreate() check-in işlemi, uygulamanın başarılı bir kontrol olmadan kullanılamayacağını garanti eder. onResume() check-in işlemi, kullanıcının çalışan uygulamaya geri düğmesi gibi başka bir yöntemle geri dönmesi durumunda 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ı önle

Bir FCM kayıt jetonu oluşturulduğunda kitaplık, tanımlayıcıyı ve yapılandırma verilerini Firebase'e yükler. Belirtecin otomatik oluşturulmasını engellemeyi tercih ederseniz, bu meta veri değerlerini AndroidManifest.xml dosyanıza ekleyerek Analytics koleksiyonunu 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 ç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şlatıldığında kalıcı olur.

Sonraki adımlar

İstemci uygulaması kurulduktan sonra Bildirimler oluşturucuyla aşağı akış mesajları göndermeye hazırsınız. Bu işlevsellik, indirebileceğiniz, ç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 amaç filtresi tanımlayabilir ve gelen mesajlara yanıt verecek bir etkinlik uygulayabilirsiniz. Ayrıntılar için uygulama sunucusundan mesaj gönderme kılavuzlarına bakın:

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