Firebase bildirimleri, ön plana/arka plana bağlı olarak farklı davranır
durumu hakkında daha fazla bilgi edinin. Ön planda görüntülenen uygulamaların
veya veri mesajlarını işleyebilir. Böyle bir durumda,
onMessageReceived
geri çağırması.
Bildirim ve veri mesajları arasındaki farkın açıklaması için
Mesaj türleri başlıklı makaleyi inceleyin.
İletileri işleme
Mesajları almak için
FirebaseMessagingService
değerleridir.
Hizmetiniz onMessageReceived
ve onDeletedMessages
koşullarını geçersiz kılmalıdır
daha fazla bilgi edindiniz.
Bir iletinin işlenmesi için gereken süre, gecikmelere bağlı olarak 20 saniyeden kısa olabilir.
onMessageReceived
çağrılmadan önce ücretlendirme (OS gecikmeleri, uygulama başlatma süresi,
diğer işlemler tarafından engellenen ana iş parçacığı veya önceki onMessageReceived
çok uzun sürüyor. Sonrasında, Android'in
işlem
öldürme veya Android O'nun
arka planda yürütme sınırları işlerinizi tamamlamanızı engelleyebilir.
onMessageReceived
, aşağıdakiler dahil çoğu mesaj türü için sağlanır:
istisnalar:
-
Uygulamanız arka plandayken teslim edilecek bildirim mesajları Burada durumda, bildirim cihazın sistem tepsisine iletilir. Kullanıcı bir bildirime dokunduğunda varsayılan olarak uygulama başlatıcıyı açar.
-
Arka planda alındığında hem bildirim hem de veri yükü içeren mesajlar. Bu durumda, bildirim cihazın sistem tepsisine iletilir. ve veri yükü ekstra başlatıcı Etkinliğinizin amacı.
Özet olarak:
Uygulama durumu | Bildirim | Veriler | İkisi de |
---|---|---|---|
Ön plan | onMessageReceived |
onMessageReceived |
onMessageReceived |
Arka plan | Sistem tepsisi | onMessageReceived |
Bildirim: sistem tepsisi Veri: Amacın ekstralarında. |
Uygulama manifestini düzenleyin
FirebaseMessagingService
uygulamasını kullanmak için aşağıdakileri sayfanıza eklemeniz gerekir:
uygulama manifesti:
<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. Siz özel bir varsayılan simge ve her cihazda uygulanan özel bir varsayılan renk eşdeğer değerler bildirim yükünde ayarlanmaz.
Bu satırları,
application
etiketini kullanarak özel varsayılan simgeyi ve özel rengi ayarlayın:
<!-- 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 oluşturucu.
- Bildirim yükünde simgeyi açıkça belirtmeyen tüm bildirim mesajları.
Android,
- Bildirim oluşturucu.
- Bildirimdeki rengi açık bir şekilde ayarlamayan tüm bildirim iletileri yük.
Özel bir varsayılan simge ayarlanmazsa ve bildirim yükünde herhangi bir simge ayarlanmamışsa Android'de uygulama simgesi beyaz renkte görüntülenir.
onMessageReceived
öğesini geçersiz kıl
FirebaseMessagingService.onMessageReceived
yöntemini geçersiz kılarak
alınan iletişim bilgilerine göre
RemoteMessage
nesnesini ifade edin ve ileti verilerini alın:
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
öğesini geçersiz kıl
Bazı durumlarda FCM mesaj teslim etmeyebilir. Bu durum, aynı anda çok fazla
mesaj (>100) için beklemede
sırasında veya bağlı değilken belirli bir cihazda uygulamanızı
Bir aydan uzun bir süre içinde FCM. Böyle durumlarda
FirebaseMessagingService.onDeletedMessages()
numaralı telefonu arayabilirsiniz
Uygulama örneği bu geri çağırmayı aldığında
uygulama sunucunuzla tam senkronizasyon gerçekleştirmesi gerekir. Uygulamaya bu konuda mesaj göndermediyseniz
cihazı son 4 hafta içinde ararsa FCM, onDeletedMessages()
adlı cihazı aramaz.
Bildirim mesajlarını arka plandaki bir uygulamada işleme
Android, uygulamanız arka planda çalışırken bildirim mesajlarını şuraya yönlendirir: sistem tepsisini açın. Kullanıcı bildirime dokunduğunda uygulama başlatıcıyı açan kişi: varsayılandır.
Buna, hem bildirim hem de veriler içeren mesajlar dahildir yük (ve Notifications konsolundan gönderilen tüm mesajlar). Bu durumlarda, bildirim cihazın veri yükü amaçlanan ekstra şeklinde teslim edilir başlatıcı Etkinliğiniz.
Uygulamanıza mesaj teslimiyle ilgili analizler için bkz. FCM raporlama kontrol paneli, Apple ve Android cihazlarda gönderilen ve açılan iletilerin sayısı "gösterimler" için veriler (kullanıcılar tarafından görülen bildirimler).
FCM mesajlarını doğrudan başlatma modunda al
Şu tarihten önce uygulamalara FCM mesajları göndermek isteyen geliştiriciler: cihazın kilidi açıldığında, cihaz şu anda Android uygulamasının mesaj almasını sağlayabilir. doğrudan başlatma modunda. Örneğin, uygulamanızın kullanıcılarının cihaz kilitli olsa bile alarm bildirimi alabilir.
Bu kullanım alanını oluştururken, doğrudan başlatma moduna ilişkin en iyi uygulamalar ve kısıtlamalar hakkında daha fazla bilgi edinin. İnsanların doğrudan başlatmanın etkin olduğu görünürlüğün göz önünde bulundurulması özellikle önemlidir mesajlar; cihaza erişimi olan tüm kullanıcılar bu mesajları olmadan görüntüleyebilir Kullanıcı kimlik bilgilerini girerek.
Ön koşullar
- Cihaz doğrudan başlatma moduna uygun şekilde 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ını alabilmesi için FCM SDK'sını (
com.google.firebase:firebase-messaging
) kullanıyor olması gerekir.
Uygulamanızda doğrudan başlatma modu ile mesaj işlemeyi etkinleştirin
Uygulama düzeyindeki Gradle dosyasına FCM doğrudan başlatma desteği kitaplığına bir 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şlemini fark etmesini 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
cihazının doğrudan başlatma modunda çalışabildiğinden emin olmanız önemlidir. Kontrol et
:
- Hizmet, doğrudan başlatma modunda çalışırken kimlik bilgileri korumalı depolama alanına erişmemelidir.
- Hizmet
Activities
,BroadcastReceivers
, veya doğrudan başlatma modunda çalışırken doğrudan başlatmaya duyarlı olarak işaretlenmemiş diğerServices
öğeleri. - Hizmetin kullandığı hiçbir kitaplık, aynı zamanda kimlik bilgileriyle korunan depolama alanına veya doğrudan başlatma modunda çalışırken Direct BootAware olmayan bileşenleri çağırır. Yani, kitaplıklar hizmetten çağrılan uygulama kullanımları, doğrudan başlatmaya duyarlı olmalıdır veya uygulamanın doğrudan başlatma modunda çalışıp çalışmadığını kontrol etmesi ve kullanıcıları bu modda çağırmaması gerekir. Örneğin, Firebase SDK'ları doğrudan başlatma ile çalışır ( doğrudan başlatma modunda kilitleniyorsa), ancak birçok Firebase API'si doğrudan çağrılmayı desteklemez açın.
- Uygulama özel bir
Application
kullanıyorsaApplication
uygulamasının da doğrudan başlatması gerekir. haberdar (doğrudan başlatma modunda kimlik bilgisi korumalı depolama alanına erişim yok).
Doğrudan başlatma modundaki cihazlara mesaj gönderme hakkında yardım için bkz. Doğrudan başlatma özellikli mesajlar gönderin.