FCM показывает сообщение по умолчанию, чем пользовательское сообщение, когда приложение не запущено - PullRequest
0 голосов
/ 28 октября 2019

Проблема: Мой код FCM показывает разные сообщения для разных случаев:

Случай 1: Когда приложение работает, оно показывает тело настраиваемого уведомления

Случай 2: Когдаприложение работает в фоновом режиме, оно показывает настраиваемое тело уведомления

Случай 3: когда приложение не запущено, оно показывает сообщение по умолчанию, полученное от FCM, чем настраиваемое сообщение

Код:

/* The class extends FirebaseMessagingService() */

override fun onMessageReceived(remoteMessage: RemoteMessage) {
        try {
/* Some other codes */            

            val pendingIntent = PendingIntent.getActivity(this, 0, Intent(), PendingIntent.FLAG_ONE_SHOT)
            val builder = NotificationCompat.Builder(this, "" + R.string.notification_channel_id)
                    .setSmallIcon(R.mipmap.ic_launcher_round)
                    .setContentTitle(remoteMessage.notification!!.title)
                    .setContentText(getString(R.string.custom_message_body))
                    .setAutoCancel(true)
                    .setContentIntent(pendingIntent)
            val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                val channel = NotificationChannel("" + R.string.notification_channel_id, "Alert channel", NotificationManager.IMPORTANCE_DEFAULT)
                manager.createNotificationChannel(channel)
            }
            manager.notify(0, builder.build())

/* super.onMessageReceived(remoteMessage) was REMOVED to prevent default functions */
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Это ожидается. FCM имеет различное поведение для статуса приложения (передний план и фон / убит). Вы должны обрабатывать это с помощью полезной нагрузки, которую вы отправили с сервера, в соответствии с вашим вариантом использования.

Сообщение, отправленное с сервера, должно быть отправлено в формате «уведомления» или «данные», из панели мониторинга или API на стороне сервера. ,Примечание: из firebase dashobard вы можете отправлять только тело уведомления, а не данные. В таких случаях FCM будет отображать уведомление напрямую, без обратного вызова для вашего приложения.

На стороне сервера Ниже приведены примеры форматов:

Уведомление Тип Формат Примечание. Система Android по умолчанию отображает уведомление в области уведомлений, и вам не нужно его отображать.

 { 
    "to": "your_token_id",
     "notification" : {
             "title" : "FCM Notification title!",
             "body" : "FCM Notification subtext!",
             "content_available" : true,
             "priority" : "high"
     }
}

Данные Формат (для получения обратного вызова в приложении,на переднем плане и на заднем плане) Примечание. Вы должны самостоятельно обрабатывать обратный вызов и отображать уведомление.

{ 
    "to": "your_token_id",

    "data" : {
         "title" : "FCM Notification Title ",
         "subtext" : "FCM Notification Sub Title",
         "type" : "999",
         "priority" : "high"
    }
}

Клиент Android Для обработки полезной нагрузки, полученной в приемнике Android, просмотрите официальное руководство здесь

/* The class extends FirebaseMessagingService() */   
 override fun onMessageReceived(remoteMessage: RemoteMessage) {

        Log.d(TAG, "From: ${remoteMessage.from}")

        // Check if message contains a data payload.
        remoteMessage.data.isNotEmpty().let {
            Log.d(TAG, "Message data payload: " + remoteMessage.data)

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

Проверьте документацию здесь

enter image description here

0 голосов
/ 28 октября 2019

С документа

enter image description here

Когда приложение находится на переднем плане, onMessageReceived всегда вызывает.

Когда приложение находится в фоновом режиме, onMessageReceived будет вызываться, когда полезная нагрузка имеет только свойство data (его не существует, свойство notification).

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...