Firebase Cloud Messaging'i kullanarak mesaj alma

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'ı genişleten bir hizmet kullanabilirsiniz. Hizmetiniz, onMessageReceived ve onDeletedMessages geri çağırmalarını geçersiz kılmalıdır. Tam bir örnek için Firebase Cloud Messaging hızlı başlangıç örneğine bakın.

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 aramasının kısa bir yürütme süresi vardır. Bu pencerenin süresini etkileyebilecek birçok faktör vardır. Bunlar arasında 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 yer alır.

Bu nedenle, onMessageReceived içinde uzun süren görevlerden (ör. bildirimde göstermek için sunucudan resim getirme) kaçınmalı ve bunun yerine, tamamlanması birkaç saniyeden uzun sürebilecek görevleri işlemek için WorkManager kullanarak bir görev planlamalısınız. İleti önceliği ve bunun işlemeyi nasıl etkilediği hakkında daha fazla bilgi için Yüksek ve normal öncelikli iletilerin işlenmesi başlıklı makaleyi inceleyin.

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>

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 bir 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.
}

Geçersiz kıl: onDeletedMessages

Bazı durumlarda FCM mesaj teslim etmeyebilir. Bu durum, cihaz bağlandığında uygulamanız için belirli bir cihazda çok fazla mesaj (>100) bekliyorsa veya cihaz bir aydan uzun süredir FCM'a bağlanmadıysa yaşanır. 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 teslimi hakkında daha fazla bilgi için FCM raporlama kontrol paneline bakın. Bu kontrol paneli, Apple ve Android cihazlarda gönderilen ve açılan mesaj sayısının yanı sıra Android uygulamaları için "gösterim" (kullanıcılar tarafından görülen bildirimler) verilerini kaydeder.