Firebase bildirimleri, alıcı uygulamanın ön plan/arka plan durumuna bağlı olarak farklı şekilde çalışır. Ön plandaki uygulamaların bildirim mesajları veya veri mesajları almasını istiyorsanız onMessageReceived
geri çağırma işlevini işleyen kod yazmanız gerekir.
Bildirim ve veri mesajları arasındaki farkın açıklaması için Mesaj türleri bölümüne bakın.
Mesajları işleme
Mesajları almak için
FirebaseMessagingService
süresini uzatan bir hizmet kullanın.
Hizmetiniz, onMessageReceived
ve onDeletedMessages
geri çağırma işlevlerini geçersiz kılmalıdır.
İşletim sistemi gecikmeleri, uygulama başlatma süresi, diğer işlemler tarafından engellenen ana iş parçacığı veya çok uzun süren önceki onMessageReceived
çağrıları dahil olmak üzere, onMessageReceived
çağrısından önce oluşan gecikmelere bağlı olarak, bir mesajın işlenmesi için gereken zaman aralığı 20 saniyeden kısa olabilir. Bu sürenin sonunda, Android'in işlem sonlandırma veya Android O'nun
arka planda yürütme sınırları gibi çeşitli işletim sistemi davranışları işlerinizi tamamlamanızı engelleyebilir.
onMessageReceived
, aşağıdaki istisnalarla çoğu mesaj türü için sağlanır:
-
Uygulamanız arka plandayken teslim edilecek bildirim mesajları 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 intent'inin 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: intent'in ekstralarında. |
Uygulama manifestini düzenleyin
FirebaseMessagingService
özelliğini kullanmak için uygulama manifest dosyanıza 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 belirlemeniz önerilir. Bildirim yükünde eşdeğer değerler ayarlanmadığında uygulanacak özel bir varsayılan simge ve özel bir varsayılan renk belirtebilirsiniz.
Özel varsayılan simgeyi ve özel rengi ayarlamak için aşağıdaki satırları application
etiketinin içine 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, şunun için özel varsayılan simgeyi görüntüler:
- Bildirim derleyici'den gönderilen tüm bildirim mesajları.
- Bildirim yükünde simgeyi açıkça ayarlamayan tüm bildirim mesajları.
Android, aşağıdakiler için özel varsayılan rengi kullanır:
- Bildirim derleyici'den gönderilen tüm bildirim mesajları.
- Bildirim yükünde rengi açıkça ayarlamayan tüm bildirim mesajları.
Özel bir varsayılan simge ayarlanmazsa ve bildirim yükünde herhangi bir simge ayarlanmamışsa Android, uygulama simgesini beyaz olarak görüntüler.
onMessageReceived
ayarını geçersiz kıl
FirebaseMessagingService.onMessageReceived
yöntemini geçersiz kılarak alınan RemoteMessage nesnesine dayalı işlemler gerçekleştirebilir ve mesaj verilerini alabilirsiniz:
Kotlin+KTX
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. }
onDeletedMessages
ayarını geçersiz kıl
Bazı durumlarda FCM bir mesaj yayınlamayabilir. Bu durum, belirli bir cihazda uygulamanız için çok sayıda mesaj (>100) beklemede olduğunda veya cihaz bir aydan uzun süredir FCM uygulamasına bağlanmadığında meydana gelir. Bu gibi durumlarda FirebaseMessagingService.onDeletedMessages()
çağrısı 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, onDeletedMessages()
'u aramaz.
Bildirim mesajlarını arka plandaki bir uygulamada işleme
Android, uygulamanız arka plandayken bildirim mesajlarını sistem tepsisine yönlendirir. Kullanıcı bildirime dokunduğunda varsayılan olarak uygulama başlatıcı açılır.
Buna hem bildirim hem de veri yükünü içeren mesajlar (ve Notifications konsolundan gönderilen tüm mesajlar) dahildir. Bu durumlarda, bildirim cihazın sistem tepsisine iletilir ve veri yükü, başlatıcı Etkinliğinizin amaçları doğrultusunda, ekstra bilgilerle iletilir.
Uygulamanıza mesaj teslimiyle ilgili analizler için FCM raporlama kontrol paneline göz atın. Bu kontrol panelinde, Apple ve Android cihazlarda gönderilen ve açılan mesajların sayısıyla birlikte Android uygulamalarının "gösterim sayısı" (kullanıcıların gördüğü bildirimler) ile ilgili veriler kaydedilir.
FCM mesajlarını doğrudan başlatma modunda al
Cihazın kilidi açılmadan bile uygulamalara FCM mesajları göndermek isteyen geliştiriciler, cihaz doğrudan başlatma modundayken bir Android uygulamasının mesaj almasını etkinleştirebilirler. Örneğin, uygulamanızın kullanıcılarının kilitli bir cihazda bile alarm bildirimi almasını isteyebilirsiniz.
Bu kullanım alanını oluştururken doğrudan başlatma modu için genel en iyi uygulamaları ve kısıtlamaları dikkate alın. Doğrudan başlatmanın etkin olduğu mesajların görünürlüğünün göz önünde bulundurulması özellikle önemlidir; cihaza erişimi olan herhangi bir kullanıcı, kullanıcı kimlik bilgilerini girmeden bu mesajları görüntüleyebilir.
Ön koşullar
- Cihaz, doğrudan önyükleme modu için ayarlanmalıdır.
- Cihazda Google Play Hizmetleri'nin yeni bir sürümü (19.0.54 veya üzeri) yüklü olmalıdır.
- Uygulamanın, FCM mesajları almak için FCM SDK'sını (
com.google.firebase:firebase-messaging
) kullanması gerekir.
Uygulamanızda doğrudan önyükleme modu mesajı işlemeyi etkinleştirme
Uygulama düzeyindeki Gradle dosyasına FCM doğrudan önyükleme destek kitaplığına bağımlılık ekleyin:
implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
Uygulama manifest'ine
android:directBootAware="true"
özelliğini ekleyerek uygulamanınFirebaseMessagingService
doğrudan başlatma işleminden haberdar olmasını sağlayın:<service android:name=".java.MyFirebaseMessagingService" android:exported="false" android:directBootAware="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
Bu FirebaseMessagingService
'ın doğrudan önyükleme modunda çalışabildiğinden emin olmanız önemlidir. Aşağıdaki koşulları kontrol edin:
- Hizmet, doğrudan önyükleme modunda çalışırken kimlik bilgisi korumalı depolamaya erişmemelidir.
- Hizmet, doğrudan önyükleme modunda çalışırken doğrudan önyükleme bilinir olarak işaretlenmemiş
Activities
,BroadcastReceivers
veya diğerServices
gibi bileşenleri kullanmaya çalışmamalıdır. - Hizmetin kullandığı hiçbir kitaplık, aynı zamanda doğrudan başlatma modunda çalışırken kimlik bilgisiyle korunan depolama alanına erişmemeli ve DirectBootAware olmayan bileşenleri çağırmamalıdır. Bu, uygulamanın hizmetten çağrılan ve kullandığı kitaplıkların doğrudan önyükleme bilincine sahip olması veya uygulamanın doğrudan önyükleme modunda çalışıp çalışmadığını kontrol etmesi ve bu modda kitaplıkları çağırmaması gerektiği anlamına gelir. Örneğin, Firebase SDK'ları doğrudan başlatma ile çalışır (doğrudan başlatma modunda kilitlenmeden bir uygulamaya eklenebilir), ancak birçok Firebase API'si doğrudan başlatma modunda çağrılmayı desteklemez.
- Uygulama özel bir
Application
kullanıyorsaApplication
'ün doğrudan önyükleme bilincine sahip olması da gerekir (doğrudan önyükleme modunda kimlik bilgisi korumalı depolamaya erişim yoktur).
Doğrudan başlatma modundaki cihazlara mesaj gönderme hakkında yardım için Doğrudan başlatma özellikli mesajlar gönderme bölümüne bakın.