在 onMessageReceived() 中检查通知的有效负载

Check payload of notification in onMessageReceived()

我正在尝试向我的应用程序发送数据通知,然后使用其中的数据打开片段:

override fun onMessageReceived(message: RemoteMessage) {

    Timber.d("onMessageReceived")

    try {

        val data = message.data

        if (data != null && (data.containsKey(KEY_MSG) || data.containsKey(KEY_URL))) {

            val url = data[KEY_URL]

            if (!url.isNullOrEmpty()) {
                val clickAction = message.notification?.clickAction
                val intent = Intent(clickAction)
                intent.putExtra(KEY_URL, url).putUseStateExtra(UseState(UseState.COME_FROM_NOTIFICATION)).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
            } else {
                sendNotification(data)
            }


        }
    } catch (e: Throwable) {
        Timber.e(e, "We didn't send the notification because ${e.message}")
    }
}

然后在调用 onMessageReceived() 之后我构建通知并使用以下方法发送它。一个解析出有效载荷:

private fun sendNotification(data: Map<String, String>) {

    Timber.d("Notification sent: $data type: ${data[KEY_CLOUD8_TYPE]}")

    if (Interactors.preferences.notificationsEnabled == true) {

        Timber.d(data.toString())
        val title = data[KEY_TITLE]
        val msg = data[KEY_MSG]
        var cloud8Type = data[KEY_CLOUD8_TYPE] ?: ""
        var notificationType = data[NOTIFICATION_TYPE] ?: ""
        val campaignId = (data[KEY_CAMPAIGN_ID] ?: "0")
        val url = data[KEY_URL]

        if (!url.isNullOrBlank()) {
            cloud8Type = Cloud8Type.Link
        }
        sendNotification(title, msg, cloud8Type, notificationType, campaignId, url)
    }
}

一个构建通知:

private fun sendNotification(title: String?, message: String?, cloud8Type: String, notificationType: String, offerId: String, url: String?) {
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

    val channelId = "Main"

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val notificationChannel = NotificationChannel(channelId, "My Notifications", NotificationManager.IMPORTANCE_HIGH)

        // Configure the notification channel.
        notificationChannel.description = "Channel description"
        notificationChannel.enableVibration(true)
        notificationManager.createNotificationChannel(notificationChannel)
    }

    val pendingIntent = getNotificationIntent(cloud8Type, notificationType, offerId, url)
    val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
    val notificationBuilder = NotificationCompat.Builder(this, channelId)
    notificationBuilder.setSmallIcon(R.drawable.ic_notification)
    notificationBuilder.setContentTitle(title)
    notificationBuilder.setContentText(message)
    notificationBuilder.setAutoCancel(true)
    notificationBuilder.setSound(defaultSoundUri)
    notificationBuilder.setContentIntent(pendingIntent)
    notificationManager.notify(0, notificationBuilder.build())
}

还有两个使用有效载荷的内容来构建一个意图:

private fun getNotificationIntent(cloud8Type: String, notificationType: String, offerId: String, url: String?): PendingIntent {

    Timber.d("Notification type: $cloud8Type}")

    val useState = UseState(UseState.COME_FROM_NOTIFICATION)
    val intent = getNotificationIntent(this, cloud8Type, notificationType, useState, offerId, url = url)

    return PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}

internal fun getNotificationIntent(
        context: Context,
        cloud8Type: String?,
        notificationType: String,
        useState: UseState,
        offerId: String?,
        url: String?
    ): Intent {

        var intent = Intent()
        when (cloud8Type) {
            Cloud8Type.NewOffer, Cloud8Type.NewChallengeOffer, Cloud8Type.Link ->
                intent = StartActivity.newInstance(context, useState, offerId, url)

            Cloud8Type.DailyEarning, Cloud8Type.YouDidIt, Cloud8Type.FundsTransfered, Cloud8Type.OfferPayment, Cloud8Type.OfferDonation -> {
                intent = if (Interactors.preferences.the8CloudSdkInfo.showPayoutTab) {
                    openSponsorTree(context, useState, ASponsorTree.TAB_PAYOUT, null)
                } else {
                    APayoutMain.newIntent(context)
                }
            }
            Cloud8Type.NewOffers ->
                intent = openSponsorTree(context, useState, ASponsorTree.TAB_FEED, null)


            else -> {
                when (notificationType) {
                    NotificationType.Payment -> intent = openSponsorTree(context, useState, ASponsorTree.TAB_PAYOUT, null)
                }
            }
        }



        return intent
    }

我正在尝试调试收到通知时收到的负载,但 none 我的日志语句在应用程序关闭时显示。有什么方法可以查看 onMessageReceived() 中的 RemoteMessage 返回了什么?关于如何完成我想完成的事情,还有什么我应该知道的吗?

我在payload中添加了“notification”属性并给了它一个click_action,然后在我的开始activity.

拦截了它

请不要在 notification 属性中发送您的负载。它只会在应用程序处于前台状态时触发。要在后台状态下也获得通知,您必须将有效负载发送到 data 属性,而不是通知。

示例:

{
    "condition": " Better now",
    "priority" : "normal",
    "time_to_live" : 0,,
    "data" : {
        "id" : 1,
        "text" : "text is here!",
        "link" : "www.gmail.com"
    }
}