Bu kılavuzda, mesajları güvenilir bir şekilde alabilmeniz için mobil ve web istemci uygulamalarınızda Firebase Cloud Messaging'yı nasıl ayarlayacağınız açıklanmaktadır.
İleti almak için FirebaseMessagingService
uzantılı bir hizmet kullanın.
Hizmetiniz, onMessageReceived
ve onDeletedMessages
geri çağırmalarını geçersiz kılmalıdır.
onMessageReceived
, aşağıdaki istisnalar dışında çoğu ileti türü için sağlanır:
Uygulamanız arka plandayken teslim edilen bildirim iletileri. Bu durumda bildirim, cihazın sistem tepsisine gönderilir. Kullanıcı bir bildirime dokunduğunda varsayılan olarak uygulama başlatıcı açılır.
Arka planda alındığında hem bildirim hem de veri yükü içeren mesajlar. Bu durumda bildirim, cihazın sistem tepsisine gönderilir ve veri yükü, başlatıcı etkinliğinizin amacının ekstralarında gönderilir.
Özet olarak:
Uygulama durumu | Bildirim | Veriler | İkisi de |
---|---|---|---|
Ön plan | onMessageReceived |
onMessageReceived |
onMessageReceived |
Arka plan | Sistem tepsisi | onMessageReceived |
Bildirim: Sistem tepsisi Veriler: Amaç ekstralarında. |
İleti türleri hakkında daha fazla bilgi için Bildirimler ve veri iletileri başlıklı makaleyi inceleyin.
onMessageReceived
geri çağırma işlemine, bildirim yayınlamanıza olanak tanıyan zaman aşımları verilir ancak zamanlayıcılar, uygulamanın ağa erişmesine veya ek işlemler yapmasına izin verecek şekilde tasarlanmamıştır. Bu nedenle, uygulamanız daha karmaşık işlemler yapıyorsa uygulamanın işini tamamlayabilmesi için ek çalışmalar yapmanız gerekir.
Uygulamanızın bir mesajı işlemek için yaklaşık 10 saniyeye ihtiyacı olabileceğini düşünüyorsanız WorkManager işi planlamalı veya aşağıdaki WakeLock yönergelerini uygulamalısınız. Bazı durumlarda, onMessageReceived
çağrısından önce oluşan gecikmelere (işletim sistemi gecikmeleri, uygulamanın başlatılma süresi, ana iş parçacığının diğer işlemler tarafından engellenmesi veya önceki onMessageReceived
çağrılarının çok uzun sürmesi gibi) bağlı olarak bir iletinin işlenme süresi 10 saniyeden kısa olabilir. Bu zamanlayıcının süresi dolduktan sonra uygulamanız işlem sonlandırma veya arka planda yürütme sınırlarına tabi olabilir. Ağ işlemlerindeki ve uygulama başlatmadaki gecikmelerin önemli olabileceğini unutmayın. Bu nedenle, ağ erişimi veya yoğun veri yükleme gereksinimleri gibi eşzamansız bağımlılıklar varsa mesaj işleme sürecinizin uzun süreceğini göz önünde bulundurarak planlama yapın.
Uygulama manifestini düzenleme
FirebaseMessagingService
özelliğini kullanmak için uygulama manifestinize aşağıdakileri eklemeniz gerekir:
<service
android:name=".java.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
Ayrıca, bildirimlerin görünümünü özelleştirmek için varsayılan değerler ayarlamanız önerilir. Bildirim yükünde eşdeğer değerler ayarlanmadığında uygulanan özel bir varsayılan simge ve özel bir varsayılan renk belirtebilirsiniz.
Özel varsayılan simgeyi ve özel rengi ayarlamak için application
etiketi içine şu satırları ekleyin:
<!-- 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" />
Android, aşağıdakiler için özel varsayılan simgeyi gösterir ve kullanır:
- Bildirim oluşturucu'dan gönderilen tüm bildirim iletileri.
- Bildirim yükünde simgeyi açıkça ayarlamayan tüm bildirim mesajları.
Özel bir varsayılan simge ayarlanmamışsa ve bildirim yükünde simge ayarlanmamışsa Android, beyaz olarak oluşturulan uygulama simgesini gösterir.
Geçersiz kıl: onMessageReceived
FirebaseMessagingService.onMessageReceived
yöntemini geçersiz kılarak, alınan RemoteMessage nesnesine göre işlemler gerçekleştirebilir ve mesaj verilerini alabilirsiniz:
Kotlin
override fun onMessageReceived(remoteMessage: RemoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: ${remoteMessage.from}") // Check if message contains a data payload. if (remoteMessage.data.isNotEmpty()) { Log.d(TAG, "Message data payload: ${remoteMessage.data}") // Check if data needs to be processed by long running job if (needsToBeScheduled()) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob() } else { // Handle message within 10 seconds handleNow() } } // Check if message contains a notification payload. remoteMessage.notification?.let { Log.d(TAG, "Message Notification Body: ${it.body}") } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
Java
@Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
FCM mesajları işlenirken cihazı uyanık tutma
Uygulamanızın bir FCM mesajını işlerken cihazı uyanık tutması gerekiyorsa bu süre zarfında bir WakeLock tutması veya bir WorkManager işi oluşturması gerekir. WakeLock'lar, onMessageReceived
varsayılan zaman aşımlarını aşabilecek kısa işleme etkinlikleri için iyi sonuç verir. Sunucularınıza birden fazla sıralı RPC gönderme gibi uzun süren iş akışlarında, WakeLock yerine WorkManager işi kullanmak daha uygundur. Bu bölümde, WakeLock'ların nasıl kullanılacağına odaklanıyoruz. WakeLock, uygulamanız çalışırken cihazın uyku moduna geçmesini engeller. Bu durum, pil kullanımının artmasına neden olabilir. Bu nedenle, WakeLock'lar yalnızca uygulamanızın mesaj işlerken duraklatılmaması gereken durumlarda kullanılmalıdır. Örneğin:
- Kullanıcıya gönderilen ve zamana duyarlı olan bildirimler.
- Cihaz dışında, kesintiye uğramaması gereken işlemler (ör. ağ aktarımları veya eşlenmiş kol saati gibi başka bir cihazla iletişim).
Öncelikle uygulamanızın WakeLock izni istediğinden emin olmanız gerekir (FCM SDK'sı bunu varsayılan olarak içerdiğinden normalde hiçbir şey eklenmesi gerekmez).
<uses-permission android:name="android.permission.WAKE_LOCK" />
Ardından, uygulamanız FirebaseMessagingService.onMessageReceived()
geri çağırma işleminin başında bir WakeLock edinmeli ve geri çağırma işleminin sonunda bunu serbest bırakmalıdır.
Uygulamanın özel FirebaseMessagingService
:
@Override
public void onMessageReceived(final RemoteMessage message) {
// If this is a message that is time sensitive or shouldn't be interrupted
WakeLock wakeLock = getSystemService(PowerManager.class).newWakeLock(PARTIAL_WAKE_LOCK, "myApp:messageReceived");
try {
wakeLock.acquire(TIMEOUT_MS);
// handle message
...
finally {
wakeLock.release();
}
}
Geçersiz kıl: onDeletedMessages
Bazı durumlarda FCM mesaj teslim etmeyebilir. Bu durum, cihaz bağlandığında belirli bir cihazda uygulamanız için çok fazla mesaj (>100) bekliyorsa veya cihaz bir aydan uzun süredir FCM'a bağlanmadıysa meydana gelir. Bu durumlarda FirebaseMessagingService.onDeletedMessages()
numarasına geri arama alabilirsiniz. Uygulama örneği bu geri çağırmayı aldığında uygulama sunucunuzla tam senkronizasyon gerçekleştirmelidir. Son 4 hafta içinde söz konusu cihazdaki uygulamaya mesaj göndermediyseniz FCM aranmazsınız onDeletedMessages()
.
Arka plana alınmış bir uygulamada bildirim mesajlarını işleme
Uygulamanız arka plandayken Android, bildirim mesajlarını sistem tepsisine yönlendirir. Kullanıcı bildirime dokunduğunda uygulama başlatıcı varsayılan olarak açılır.
Bu, hem bildirim hem de veri yükü içeren mesajları (ve Bildirimler Konsolu'ndan gönderilen tüm mesajları) kapsar. Bu durumlarda bildirim, cihazın sistem tepsisine gönderilir ve veri yükü, başlatıcı etkinliğinizin amacının ekstralarında gönderilir.
Uygulamanıza mesaj teslimiyle ilgili analizler için
FCM raporlama kontrol paneline bakın. Bu kontrol paneli, Apple ve Android cihazlarda gönderilen ve açılan mesajların sayısını kaydeder. Ayrıca, Android uygulamaları için "gösterim" (kullanıcıların gördüğü bildirimler) verilerini de içerir.