【问题标题】:How to access data payload in a backgrounded app after user taps the FCM notification?用户点击 FCM 通知后,如何在后台应用程序中访问数据负载?
【发布时间】:2018-06-06 16:51:00
【问题描述】:

我通过将以下 JSON 内容 POST 到 URL https://fcm.googleapis.com/fcm/send

,向 后台 中的 Android 应用发送 FCM 通知消息数据负载
{
    "notification":{"body":"Alexander performs a move!"},
    "data":{"gid":1},
    "to":"c0k6VWNdTSo:APA91bETXBGasi-X6-VGWTWYtSv3u1NETwqblEW1uoE1MswFkb9-Yf-rlVEGbaPD4gLQh3JLWIAyQRvAYNcdtmZLgFDhUEnXwFpVQSNFFr0xl47sK9FnvRY9J6JLX2P34UvpuCbZYBZ4"
}

并收到 FCM 后端发送成功的确认信息:

{
    "multicast_id":7103158248293730650,
    "success":1,
    "failure":0,
    "canonical_ids":0,
    "results":[{"message_id":"0:1514203203800219%c7d12ab4c7d12ab4"}]
}

之后,我点击 Android 手机顶部的通知,我的应用正在启动(之前它在 背景 中):

然后我尝试访问“gid”值,我通过onCreate 方法中的代码在通知的“数据”部分中设置了该值:

    Intent i = getIntent();
    int gid = i.getIntExtra("gid", 0);
    if (gid > 0) {
        // TODO show GameFragment
    }

不幸的是,没有这样的 EXTRA(您还可以在上面的调试器屏幕截图中看到,由于某种原因,没有通过意图传递的额外内容)。

请问我在这里缺少什么?根据Firebase doc(强调我的):

在后台时,应用会在 通知托盘,并且仅在用户点击时处理数据负载 在通知上。

点击通知后如何访问“数据”部分,不是作为intent extra传递的吗?

【问题讨论】:

  • 请发布您的 onMessageReceived 方法的代码
  • onMessageReceived 方法没有被调用,因为我正在向 background 中的应用发送 mixed 推送通知。我的问题是用户点击通知后如何处理“数据”部分。
  • 如果您仔细查看上面的调试图片,我发现 i.extras 中确实存在 gid,这是您发送的来自 firebase 的 1
  • 我的意思是检查图像右下角框 -> 在主要活动下方有“i”变量,您已将其扩展为调试,其中有额外内容,在该行中您会看到 gid=1 我猜您在活动包中收到 gid,KEY_GID 的值是多少?
  • 是的,你可能是对的,这就是我的价值。 KEY_GID 字符串只是“gid”。

标签: android firebase push-notification firebase-cloud-messaging


【解决方案1】:

通知部分完全由谷歌处理。也没有通知点击事件。默认情况下,点击通知时,启动器活动将被打开并完全由谷歌管理。所以你必须通过检查来管理启动器活动数据部分。

数据部分处理

因为数据部分完全取决于你,你是如何从服务器发送的

if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Message data payload: " + remoteMessage.getData());
        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }

【讨论】:

  • Ibrahim,如果您查看我的问题中的调试器屏幕截图,mData 为空(即使我已发送"data":{"gid":1})。所以我不能在启动意图上调用getData()。或者remoteMessage.getData() 是什么意思?正如我之前评论过的,我的应用程序在后台的onMessageReceived() 方法不应该被调用,这在the FCM doc 中有解释。
【解决方案2】:

您需要将 Intent Filter 设置为您的 manifest.xml 文件。

步骤:1

<intent-filter>
   <action android:name=".Activity.HomeActivity" />
   <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

第 2 步:

"click_action":".HomeActivity" 到您的通知数据

“通知”:{ "click_action":".HomeActivity" "body": "很酷的优惠。在到期前获取它们!", "title": "80% 折扣", “图标”:“应用图标”, "click_action": "activity name" //如果需要可选..... }

这里是关于 firebase 消息的更清晰的概念。我是从他们的支持团队那里找到的。

Firebase 具有三种消息类型:

通知消息:

通知消息在后台或前台工作。当应用程序处于后台时,通知消息将传递到系统托盘。如果应用程序在前台,消息由 onMessageReceived() 或 didReceiveRemoteNotification 回调处理。这些本质上就是所谓的显示消息。

数据信息:

在Android平台上,数据消息可以在后台和前台工作。数据消息将由 onMessageReceived() 处理。这里有一个特定于平台的说明:在 Android 上,可以在用于启动您的活动的 Intent 中检索数据有效负载。详细地说,如果你有 "click_action":"launch_Activity_1",你可以通过 getIntent() 仅从 Activity_1 中检索此意图。

同时包含通知和数据负载的消息:在后台时,应用程序会在通知托盘中接收通知负载,并且仅在用户点击通知时处理数据负载。在前台时,您的应用会收到一个消息对象,其中包含两个可用的有效负载。其次,click_action 参数通常用于通知负载而不是数据负载。如果在数据负载中使用,此参数将被视为自定义键值对,因此您需要实现自定义逻辑才能使其按预期工作。

另外,我建议您使用 onMessageReceived 方法(请参阅数据消息)来提取数据包。根据您的逻辑,我检查了 bundle 对象并没有找到预期的数据内容。这是对类似案例的参考,可能会提供更清晰的信息。

欲了解更多信息,请访问我的这个帖子

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多