| Platform seçin: | iOS+ Android Web Flutter Unity C++ |
Bu kılavuzda, mesajları güvenilir bir şekilde gönderebilmeniz için Android istemci uygulamalarınızda Firebase Cloud Messaging'yı kullanmaya nasıl başlayacağınız açıklanmaktadır.
FCM istemcileri, Android 6.0 veya sonraki sürümleri çalıştıran ve Google Play Store uygulaması yüklü olan cihazlar ya da Google API'leri ile Android 6.0 çalıştıran bir emülatör gerektirir. Android uygulamalarınızı yalnızca Google Play Store üzerinden dağıtmak zorunda olmadığınızı unutmayın.
SDK'yı ayarlama
Henüz yapmadıysanız Firebase'i Android projenize ekleyin.
FCM ile en iyi deneyimi elde etmek için projenizde Google Analytics'ı etkinleştirmenizi Google Analytics önemle tavsiye ederiz. Google Analytics, FCM için ileti teslimi raporlaması için gereklidir.
Uygulama manifestinizi düzenleme
Uygulamanızın manifest dosyasına aşağıdakileri ekleyin:
FirebaseMessagingService'ı genişleten bir hizmet. Bu, arka plandaki uygulamalarda bildirim almanın dışında ileti işleme yapmak istiyorsanız gereklidir. Ön plandaki uygulamalarda bildirim almak, veri yükü almak ve daha fazlası için bu hizmeti genişletmeniz gerekir.- (İsteğe bağlı) Uygulama bileşeninde, varsayılan bildirim simgesi ve rengini ayarlamak için kullanılan meta veri öğeleri. Android, gelen mesajlarda simge veya renk açıkça ayarlanmadığında bu değerleri kullanır.
- (İ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 ederseniz,
default_notification_channel_iddeğerini, gösterildiği gibi bildirim kanalı nesnenizin kimliğine ayarlayın. FCM, gelen mesajlar bir bildirim kanalını açıkça ayarlamadığında bu değeri kullanır. Daha fazla bilgi için Bildirim kanallarını yönetme başlıklı makaleyi inceleyin.
<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" />
<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 isteğinde bulunma
Android 13, bildirim göstermek için yeni bir çalışma zamanında istenen izin sunar. Bu durum, Android 13 veya sonraki sürümlerde çalışan ve FCM bildirimlerini kullanan tüm uygulamaları etkiler.
Varsayılan olarak, FCM SDK'sı (23.0.6 veya sonraki bir sürüm) manifestte tanımlanan POST_NOTIFICATIONS iznini içerir. Ancak uygulamanızın, android.permission.POST_NOTIFICATIONS sabitini kullanarak bu iznin çalışma zamanı sürümünü de istemesi gerekir. Kullanıcı bu izni vermediği sürece uygulamanızın bildirim göstermesine izin verilmez.
Yeni çalışma zamanında istenen izni istemek için:
Kotlin
// 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, kullanıcıya uygulamaya bildirim gönderme izni vermesi durumunda etkinleştirilecek özellikleri açıklayan bir kullanıcı arayüzü göstermeniz gerekir. Bu kullanıcı arayüzünde, kullanıcılara Tamam ve Hayır, teşekkürler düğmeleri gibi kabul etme veya reddetme seçenekleri sunulmalıdır. Kullanıcı Tamam'ı seçerse doğrudan izin isteğinde bulunun. 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ğiyle ilgili daha fazla en iyi uygulama için Bildirim çalışma zamanı izni başlıklı makaleyi inceleyin.
Android 12L'yi (API düzeyi 32) veya daha eski 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 isteklerinin zamanlamasıyla ilgili önemli uyarılar vardır:
- Uygulamanız arka planda çalışırken ilk bildirim kanalını oluşturursa (FCM SDK'sı, FCM bildirimi alırken bunu yapar) Android, bildirimin gösterilmesine izin vermez ve uygulamanız bir sonraki açılışında bildirim izni için kullanıcıya istem göstermez. Bu nedenle, uygulamanız açılmadan ve kullanıcı izni kabul etmeden önce alınan bildirimler kaybolur.
- İzin istemek için platformun API'lerinden yararlanmak üzere uygulamanızı Android 13'ü veya sonraki sürümleri hedefleyecek şekilde güncellemenizi önemle öneririz. Bu mümkün değilse uygulamanız, bildirim izni iletişim kutusunu tetiklemek ve bildirimlerin kaybolmadığından emin olmak için uygulamaya bildirim göndermeden önce bildirim kanalları oluşturmalıdır. Daha fazla bilgi için bildirim izniyle ilgili en iyi uygulamaları inceleyin.
İsteğe bağlı: POST_NOTIFICATIONS iznini kaldırma
FCM SDK'sı varsayılan olarak POST_NOTIFICATIONS iznini içerir.
Uygulamanız bildirim mesajları kullanmıyorsa (FCM
bildirimler, başka bir SDK veya doğrudan uygulamanız tarafından yayınlanan bildirimler aracılığıyla) ve iznin uygulamanıza dahil edilmesini istemiyorsanız manifest birleştiricinin
remove işaretini kullanarak izni kaldırabilirsiniz. Bu iznin kaldırılması durumunda yalnızca FCM bildirimlerinin değil, tüm bildirimlerin gösterilmeyeceğini unutmayın. Uygulamanızın manifest dosyasına aşağıdakileri ekleyin:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>
Firebase kurulum kimliğine erişme
Uygulamanızın ilk başlatılmasında FCM SDK'sı, uygulama örneğini FCM ile kaydeder ve uygulama örneği için bir tanımlayıcı döndürür. Ayrı uygulama örneklerini hedeflemek istiyorsanız
FirebaseMessagingService öğesini genişleterek ve
onRegistered() öğesini geçersiz kılarak bu tanımlayıcıya erişmeniz gerekir.
En iyi uygulama olarak, ilk başlatma işleminden sonra tanımlayıcı değişebileceğinden en son güncellenen tanımlayıcıyı alın.
Firebase kurulum kimliği üzerinden kaydı etkinleştirme
Firebase Kurulum Kimliği (FID)'ni kullanarak uygulama örneğinizi FCM ile kaydetmeyi etkinleştirmek içinAndroidManifest.xml dosyanıza aşağıdaki meta veri işaretini ekleyin:
<meta-data android:name="firebase_messaging_installation_id_enabled" android:value="true" />
onRegistered() geri arama işlevini uygulama
Uygulama örnekleri, FCM ile kaydedildikten sonra Firebase kurulum kimliği (FID) kullanılarak hedeflenir. Kayıt sırasında FID'yi almak için
onRegistered() geri çağırma işlevini uygulayın.
Bir uygulama örneği kaydedildikten sonra FCM SDK'sı
FID değişikliklerini otomatik olarak izler ve değişiklik algılandığında geri çağırmayı tetikler.
Otomatik başlatma etkinleştirildiğinde FCM SDK'sı, kaydın güncel kalması için FCM arka ucuyla otomatik olarak senkronize olur ve uygulama sunucunuzun mevcut tanımlayıcıya sahip olmasını sağlamak için geri çağırmayı çağırır. FID kaybına veya eski FID'lere karşı koruma sağlamak için bu geri çağırma tetiklendiğinde FID'yi uygulama sunucunuza göndermeniz gerekir.
Kotlin
/** * There are three scenarios when `onRegistered` is called: * 1) Every time a manual `register()` call finishes successfully * 2) Whenever the FID is changed and the app is re-registered with FCM via the new FID. * 3) Automatically on app startup or routine sync when auto-initialization is enabled. * Under #2, there are three scenarios when the existing FID is changed: * A) App is restored to a new device * B) User uninstalls/reinstalls the app * C) User clears app data */ override fun onRegistered(installationId: String) { Log.d(TAG, "Registered installation ID: $installationId") // Send the Firebase Installation ID to your app server. sendRegistrationToServer(installationId) }
Java
/** * There are three scenarios when `onRegistered` is called: * 1) Every time a manual `register()` call finishes successfully * 2) Whenever the FID is changed and the app is re-registered with FCM via the new FID * 3) Automatically on app startup or routine sync when auto-initialization is enabled. * Under #2, there are three scenarios when the existing FID is changed: * A) App is restored to a new device * B) User uninstalls/reinstalls the app * C) User clears app data */ @Override public void onRegistered(@NonNull String installationId) { Log.d(TAG, "Registered installation ID: " + installationId); // Send the Firebase Installation ID to your app server. sendRegistrationToServer(installationId); }
Otomatik başlatma devre dışı bırakıldığında manuel olarak kaydetme
Otomatik başlatmayı devre dışı bırakmanız gerekiyorsa FCM SDK'sı otomatik olarak senkronize olmaz veya başlatma sırasında
onRegistered() geri çağırma işlevini tetiklemez. Bildirim izinleri verildikten sonra otomatik başlatmayı yeniden etkinleştirmeniz önemle tavsiye edilir. Daha fazla bilgi edinmek için
Otomatik başlatmayı yeniden etkinleştirme başlıklı makaleyi inceleyin.
Otomatik başlatma devre dışı kalmaya devam etmesi gerekiyorsa
FirebaseMessaging.getInstance().register() işlevini uygulama başlatılırken çağırarak
onRegistered() geri çağırma işlevi üzerinden kaydı ve FID teslimini tetikleyin. Bu aramayı, ana
onCreate() yönteminizin Activity yöntemi içinde yürütebilirsiniz.
Kotlin
// Trigger manual registration if auto-initialization is turned off. // Consider calling this every time the app starts to guarantee sync status. FirebaseMessaging.getInstance().register() .addOnCompleteListener(this) { task -> if (!task.isSuccessful()) { // Registration failed. Consider retrying the registration with exponential backoff. Log.w(TAG, "Failed to register with Firebase Cloud Messaging", task.exception) } // Success! The Firebase Installation ID can be used to target messages to this app // instance and will be delivered asynchronously to your `onRegistered()` callback. }
Java
// Trigger manual registration if auto-initialization is turned off. // Consider calling this every time the app starts to guarantee sync status. FirebaseMessaging.getInstance().register() .addOnCompleteListener(task -> { if (!task.isSuccessful()) { // Registration failed. Consider retrying the registration with exponential backoff. Log.w(TAG, "Failed to register with Firebase Cloud Messaging", task.exception) } // Success! The Firebase Installation ID can be used to target messages to this app // instance and will be delivered asynchronously to your `onRegistered()` callback. });
FCM kayıt jetonuna erişme (desteği sonlandırıldı)
Uygulamanızın ilk başlatılmasında FCM SDK, istemci uygulaması örneği için bir kayıt jetonu oluşturur. Tek uygulama örneklerini hedeflemek veya cihaz grupları oluşturmak istiyorsanız
FirebaseMessagingService öğesini genişleterek ve onNewToken öğesini geçersiz kılarak bu jetona erişmeniz gerekir. Jeton, ilk başlatma işleminden sonra döndürülebileceğinden en son güncellenen kayıt jetonunu almanızı önemle tavsiye ederiz.
Kayıt jetonu şu durumlarda değişebilir:
- Uygulama yeni bir cihaza geri yüklendiğinde
- Kullanıcı uygulamayı kaldırır/yeniden yüklerse
- 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
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 işlemi tetiklenir.
Kotlin
/** * 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'nin yüklü olup olmadığını kontrol etme
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. Daha fazla bilgi için Google Play Hizmetleri'ni kurma başlıklı makaleyi inceleyin. 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ılamamasını sağlar. onResume() ile yapılan kontrol, kullanıcının çalışan uygulamaya başka bir yolla (ör. geri düğmesiyle) dönmesi durumunda 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 Play Store'dan Google Play Hizmetleri'ni indirmesine izin vermek için GoogleApiAvailability.makeGooglePlayServicesAvailable() işlevini çağırabilir.
Otomatik başlatmayı önleme
FCM kaydı oluşturulduğunda kitaplık, tanımlayıcıyı ve yapılandırma verilerini Firebase'e yükler. Otomatik kaydı önlemeyi tercih ederseniz aşağıdaki meta veri değerlerini AndroidManifest.xml dosyanıza ekleyerek Analytics toplama ve FCM otomatik başlatma işlemlerini 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" />
Otomatik başlatmayı yeniden etkinleştirme
FCM'nin otomatik başlatılmasını yeniden etkinleştirmek için çalışma zamanı çağrısı yapın:
Kotlin
Firebase.messaging.isAutoInitEnabled = true
Java
FirebaseMessaging.getInstance().setAutoInitEnabled(true);
Analytics toplama özelliğini 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 da geçerliliğini korur.
Bildirim mesajı gönderme
Android istemcinizin doğru şekilde ayarlandığından emin olmak için aşağıdaki talimatları kullanarak bir test bildirimi mesajı gönderebilirsiniz:
Uygulamayı hedef cihaza yükleyip çalıştırın.
Uygulamanın cihazda arka planda çalıştığından emin olun.
Firebase konsolunda DevOps & Engagement (DevOps ve Etkileşim) > Messaging'e (Mesajlaşma) gidin.
Kampanya oluşturun.
Bu ilk mesajınızsa:
İlk kampanyanızı oluşturun'u seçin.
Firebase Notification mesajları'nı ve Oluştur'u seçin.
Daha önce kampanya oluşturduysanız:
Kampanyalar sekmesinde Yeni kampanya'yı seçin.
Bildirimler'i tıklayın.
Mesaj metnini girin. Diğer tüm alanlar isteğe bağlıdır.
Sağ bölmeden Test mesajı gönder'i seçin.
Add an FCM registration token (FCM kayıt jetonu ekle) etiketli alana, bu kılavuzun önceki bir bölümünde aldığınız kayıt jetonunu girin.
Test et'i seçin.
Uygulamanın arka planda çalıştığı hedef istemci cihaz, bildirimi almalıdır.
Uygulamanıza mesaj teslimi hakkında bilgi edinmek için Firebase konsolunda DevOps ve Etkileşim > Mesajlaşma > Raporlar kontrol paneli'ne gidin. Bu kontrol panelinde, Apple ve Android cihazlarda gönderilen ve açılan mesajların sayısı ile Android uygulamaları için "gösterim" (kullanıcıların gördüğü bildirimler) verileri kaydedilir.
Sonraki adımlar
Kurulum adımlarını tamamladıktan sonra Android'de FCM ile ilgili olarak aşağıdaki seçeneklerden yararlanabilirsiniz: