Mesajları Android uygulamasında alın

Firebase bildirimleri, alıcı uygulamanın ön plan/arka plan durumuna bağlı olarak farklı davranır. Ön plandaki uygulamaların bildirim mesajları veya veri mesajları almasını istiyorsanız onMessageReceived geri çağırmasını işlemek için 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.

İletileri işleme

Mesajları almak için FirebaseMessagingService süresini uzatan bir hizmet kullanın. Hizmetiniz onMessageReceived ve onDeletedMessages geri çağırmalarını 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 iletilir. 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 iletilir ve veri yükü, başlatıcı Etkinliğinizin amaçları doğrultusunda, fazladan olarak teslim edilir.

Özet olarak:

Uygulama durumu Bildirim Veriler Her ikisi de
Ön plan onMessageReceived onMessageReceived onMessageReceived
Genel bilgi Sistem tepsisi onMessageReceived Bildirim: sistem tepsisi
Veriler: Amacın ekstraları.
Mesaj türleri hakkında daha fazla bilgi için Bildirimler ve veri mesajları sayfasına göz atın.

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 ayarlamanız önerilir. Bildirim yükünde eşdeğer değerler ayarlanmadığında özel bir varsayılan simge ve özel bir varsayılan renk belirtebilirsiniz.

Varsayılan özel simgeyi ve özel rengi ayarlamak için application etiketinin 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, şunun için özel varsayılan simgeyi görüntüler:

  • Bildirim oluşturucudan gönderilen tüm bildirim mesajları.
  • Bildirim yükünde simgeyi açıkça belirtmeyen tüm bildirim mesajları.

Android,

  • Bildirim oluşturucudan gönderilen tüm bildirim mesajları.
  • Bildirim yükündeki rengi açık bir şekilde 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 öğesini 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 öğesini geçersiz kıl

Bazı durumlarda FCM mesaj teslim etmeyebilir. 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'ye bağlanmadığında ortaya çıkar. 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 bu cihazdaki uygulamaya mesaj göndermediyseniz FCM, onDeletedMessages() numaralı telefonu 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. FCM raporlama kontrol paneli, Apple ve Android cihazlarda gönderilen ve açılan mesaj sayısıyla birlikte Android uygulamalarına ilişkin "gösterimler" (kullanıcıların gördüğü bildirimler) verilerini kaydeder.

FCM mesajlarını doğrudan başlatma modunda al

Cihazın kilidi açılmadan önce 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 almaları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 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

  1. 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'
    
  2. Uygulama manifest'ine android:directBootAware="true" özelliğini ekleyerek uygulamanın FirebaseMessagingService 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. Aşağıdaki koşulları kontrol edin:

  • Hizmet, doğrudan başlatma modunda çalışırken kimlik bilgileri korumalı depolama alanına erişmemelidir.
  • Hizmet, doğrudan başlatma modunda çalışırken Activities, BroadcastReceivers veya doğrudan başlatmaya duyarlı olarak işaretlenmemiş diğer Services 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 doğrudan önyüklemeye duyarlı olmayan bileşenleri çağırmamalıdır. Bu nedenle, uygulamanın kullandığı ve hizmetten çağrılan kitaplıkların doğrudan başlatmaya duyarlı olması ya da uygulamanın doğrudan başlatma modunda çalışıp çalışmadığını kontrol etmesi ve bu modda çağrılmaması gerekir. Ö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ıyorsa Application öğesinin doğrudan başlatmaya duyarlı olması da gerekir (doğrudan başlatma modunda kimlik bilgileriyle korumalı depolama alanına 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.