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>
<!-- 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" />
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.