了解 2023 年 Google I/O 大会上介绍的 Firebase 亮点。了解详情

Bir Android uygulamasında mesaj alın

Firebase bildirimleri, alıcı uygulamanın ön plan/arka plan durumuna bağlı olarak farklı davranır. Ön plana alınmış uygulamaların bildirim mesajları veya veri mesajları almasını istiyorsanız, onMessageReceived geri aramasını işlemek için kod yazmanız gerekir. Bildirim ve veri mesajları arasındaki farkın açıklaması için bkz. Mesaj türleri .

Mesajları işleme

Mesaj almak için FirebaseMessagingService öğesini genişleten bir hizmet kullanın. Hizmetiniz, onMessageReceived ve onDeletedMessages geri aramalarını geçersiz kılmalıdır. Herhangi bir mesajı aldıktan sonra 20 saniye içinde işlemelidir (Android Marshmallow'da 10 saniye). Zaman penceresi, onMessageReceived çağrısından önce oluşan işletim sistemi gecikmelerine bağlı olarak daha kısa olabilir. Bu süreden sonra, Android O'nun arka planda yürütme sınırları gibi çeşitli işletim sistemi davranışları işinizi tamamlamanızı engelleyebilir. Daha fazla bilgi için mesaj önceliği hakkındaki genel bakışımıza bakın.

onMessageReceived , aşağıdaki istisnalar dışında çoğu mesaj türü için sağlanır:

  • Uygulamanız arka planda olduğunda gönderilen 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 amacının ekstralarında teslim edilir.

Özetle:

Uygulama durumu Bildiri Veri İkisi birden
ön plan onMessageReceived onMessageReceived onMessageReceived
Arka plan Sistem tepsisi onMessageReceived Bildirim: sistem tepsisi
Veri: amacın ekstralarında.
Mesaj türleri hakkında daha fazla bilgi için bkz. Bildirimler ve veri mesajları .

Uygulama bildirimini düzenleyin

FirebaseMessagingService kullanmak için uygulama bildiriminize aşağıdakini 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ğerleri 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 belirleyebilirsiniz.

Özel varsayılan 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 için özel varsayılan simgeyi görüntüler.

  • Bildirim oluşturucusundan gönderilen tüm bildirim mesajları.
  • Bildirim yükündeki simgeyi açıkça ayarlamayan herhangi bir bildirim mesajı.

Android, için özel varsayılan rengi kullanır.

  • Bildirim oluşturucusundan gönderilen tüm bildirim mesajları.
  • Bildirim yükünde rengi açıkça ayarlamayan herhangi bir bildirim mesajı.

Bildirim yükünde hiçbir özel varsayılan simge ayarlanmamışsa ve hiçbir simge ayarlanmamışsa, Android uygulama simgesini beyaz olarak görüntüler.

onMessageReceived Geçersiz Kıl

FirebaseMessagingService.onMessageReceived yöntemini geçersiz kılarak, alınan RemoteMessage nesnesine dayalı eylemler 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 geçersiz kıl

Bazı durumlarda, FCM bir mesaj teslim etmeyebilir. Bu durum, bağlandığı sırada belirli bir cihazda uygulamanız için bekleyen çok fazla mesaj (> 100) olduğunda veya cihaz bir aydan uzun bir süredir FCM'ye bağlanmadığında meydana gelir. Bu durumlarda, FirebaseMessagingService.onDeletedMessages() için bir geri arama alabilirsiniz. Uygulama örneği bu geri aramayı aldığında, uygulama sunucunuzla tam bir eşitleme gerçekleştirmelidir. Bu cihazdaki uygulamaya son 4 hafta içinde bir mesaj göndermediyseniz, FCM onDeletedMessages() öğesini aramaz.

Bildirim mesajlarını arka planda çalışan bir uygulamada yönetin

Uygulamanız arka planda olduğunda, Android bildirim mesajlarını sistem tepsisine yönlendirir. Bildirime bir kullanıcı dokunuşu, varsayılan olarak uygulama başlatıcıyı açar.

Buna hem bildirim hem de veri yükü içeren mesajlar (ve Bildirimler konsolundan gönderilen tüm mesajlar) dahildir. Bu durumlarda bildirim, cihazın sistem tepsisine iletilir ve veri yükü, başlatıcı Etkinliğinizin amacının ekstralarında teslim edilir.

Uygulamanıza ileti teslimi hakkında fikir edinmek için, Android uygulamaları için "gösterimler" (kullanıcılar tarafından görülen bildirimler) verileriyle birlikte Apple ve Android cihazlarda gönderilen ve açılan iletilerin sayısını kaydeden FCM raporlama panosuna bakın.

Doğrudan önyükleme modunda FCM mesajlarını alın

FCM mesajlarını, cihazın kilidi açılmadan önce bile uygulamalara göndermek isteyen geliştiriciler, cihaz doğrudan önyükleme modundayken bir Android uygulamasının mesaj almasını etkinleştirebilir. Örneğin, uygulamanızın kullanıcılarının kilitli bir cihazda bile alarm bildirimleri almasını isteyebilirsiniz.

Bu kullanım örneğini oluştururken, doğrudan önyükleme modu için genel en iyi uygulamaları ve kısıtlamaları göz önünde bulundurun. Doğrudan önyükleme özellikli mesajların görünürlüğünü göz önünde bulundurmak özellikle önemlidir; cihaza erişimi olan herhangi bir kullanıcı, kullanıcı kimlik bilgilerini girmeden bu mesajları görüntüleyebilir.

Önkoşullar

  • Aygıt, doğrudan önyükleme modu için ayarlanmalıdır.
  • Cihazda Google Play hizmetlerinin yeni bir sürümü (19.0.54 veya üstü) yüklü olmalıdır.
  • Uygulama, FCM mesajlarını almak için FCM SDK'sını ( com.google.firebase:firebase-messaging ) kullanıyor olmalıdır.

Uygulamanızda doğrudan önyükleme modu mesaj işlemeyi etkinleştirin

  1. Uygulama düzeyinde Gradle dosyasında, FCM doğrudan önyükleme desteği kitaplığına bir bağımlılık ekleyin:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. Uygulama manifest dosyasına android:directBootAware="true" özniteliğini ekleyerek uygulamanın FirebaseMessagingService doğrudan önyüklemesinin farkında 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 doğrudan önyükleme modunda çalışabilmesini sağlamak önemlidir. Aşağıdaki gereksinimleri kontrol edin:

  • Hizmet, doğrudan önyükleme modunda çalışırken kimlik bilgileriyle korunan depolamaya erişmemelidir.
  • Hizmet, doğrudan önyükleme modunda çalışırken doğrudan önyükleme farkında olarak işaretlenmemiş Activities , BroadcastReceivers veya diğer Services gibi bileşenleri kullanmaya çalışmamalıdır.
  • Hizmetin kullandığı hiçbir kitaplık, kimlik bilgileriyle korunan depolamaya erişmemeli veya doğrudan önyükleme modunda çalışırken directBootAware olmayan bileşenleri çağırmamalıdır. Bu, uygulamanın kullandığı ve hizmetten çağrılan kitaplıkların ya doğrudan önyükleme farkında olması gerekeceği ya da uygulamanın doğrudan önyükleme modunda çalışıp çalışmadığını kontrol etmesi ve onları bu modda çağırmaması gerektiği anlamına gelir. Örneğin, Firebase SDK'ları doğrudan önyükleme ile çalışır (bir uygulamaya doğrudan önyükleme modunda çökmeden dahil edilebilirler), ancak birçok Firebase API'si doğrudan önyükleme modunda çağrılmayı desteklemez.
  • Uygulama özel bir Application kullanıyorsa, Application ayrıca doğrudan önyüklemeyi tanıması gerekir (doğrudan önyükleme modunda kimlik bilgileriyle korunan depolamaya erişim yoktur).

Doğrudan önyükleme modundaki aygıtlara mesaj gönderme konusunda rehberlik için bkz. Doğrudan önyükleme etkin mesajlar gönderme .