Google 当应用程序处于后台状态时,FCM getIntent 未返回预期数据
Google FCM getIntent not returning expected data when app is in background state
我正在我的应用程序中实施 FCM(Firebase 消息服务)。这里一切似乎都很好,除非当应用程序处于后台状态时我无法提取预期的通知数据。
基于概念:FCM中有两种类型的消息:
display-messages:这些消息仅在您的应用程序处于前台时有效。
data-messages:即使您的应用程序处于后台,这些消息仍然有效
当我们的应用程序在后台时,Android 将通知消息定向到系统托盘。
为了处理 数据消息 你的通知应该有 click_action = "YOUR_ACTION" 字段。
我的留言会是这样的:
{
"data": {
"body": "here is body",
"title": "Title",
"click_action": "YOUR_ACTION"
},
"to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb"
}
Activity 将显示清单文件如下所示的消息:
<activity
android:name=".NotificationActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Dialog"
android:windowSoftInputMode="stateHidden" >
<intent-filter>
<action android:name="YOUR_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
点击通知后,它将重定向到我的 NotificationActivity
。在我的 NotificationActivity
in onCreate
和 onNewIntent
方法中,我使用这种方式提取消息:
Bundle bundle=getIntent().getExtras();
if(bundle!=null) {
for (String key : bundle.keySet()) {
Object value = bundle.get(key);
Log.d("DATA_SENT", String.format("%s %s (%s)", key,
value.toString(), value.getClass().getName()));
}
}
不幸的是,在我的 NotificationActivity
中,我收到以下消息:
google.sent_time: 1471631793774
来自:50711789666
google.message_id 0:1471631793776823%098e508d098e508d
collapse_key: com.myapp.package_name
但是我预期的通知数据在哪里?
这是我的系统配置:
Android 工作室版本: 2.1.3
Firebase 版本: com.google.firebase:firebase-auth:9.0.1
Google 播放服务版本 : com.google.android.gms:play-services:9.2.1
以下是一些相关链接:
- https://github.com/firebase/quickstart-android/issues/4
- https://github.com/firebase/quickstart-android/issues/47
提前致谢。抱歉英语不好。
上面android的解法是正确的。实际上,问题出在通知消息上。它向我发送 "data" 对象而不是 "notification" 对象。我的 TargetActivity
中缺少 "notification" 对象没有使用 getIntent()
收到消息。发送 "notification" 对象后,它解决了我的问题。
正确的消息格式如下:
{
"data": {
"body": "here is body",
"title": "Title"
},
"notification": {
"body": "here is body",
"title": "Title",
"click_action": "YOUR_ACTION"
},
"to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb"
}
这里是关于 firebase 消息的更清晰的概念。我是从他们的支持团队那里找到的。
Firebase 具有三种消息类型:
通知消息 : 通知消息在后台或前台工作。当应用程序处于后台时,通知消息会传送到系统托盘。如果应用程序在前台,则消息由 onMessageReceived() 或 didReceiveRemoteNotification 回调处理。这些本质上就是所谓的显示消息。
数据消息:在Android平台上,数据消息可以在后台和前台工作。数据消息将由 onMessageReceived() 处理。
此处的平台特定说明是:在 Android 上,可以在用于启动 activity 的 Intent 中检索数据有效负载。详细来说,如果你有 "click_action":"launch_Activity_1",你可以通过 getIntent() 从 Activity_1 中检索这个意图。
具有通知和数据负载的消息:
在后台时,应用程序在通知托盘中接收通知负载,并且仅在用户点击通知时处理数据负载。
在前台时,您的应用程序会收到一个消息对象,其中包含两个有效负载。
其次,click_action 参数通常用于通知有效载荷而不是数据有效载荷。如果在数据负载中使用,此参数将被视为自定义键值对,因此您需要实现自定义逻辑才能使其按预期工作。
此外,我建议您使用 onMessageReceived
方法(参见数据消息)来提取数据包。根据你的逻辑,我检查了 bundle 对象并没有找到预期的数据内容。这是对类似案例的参考,可能会更清楚。
我正在我的应用程序中实施 FCM(Firebase 消息服务)。这里一切似乎都很好,除非当应用程序处于后台状态时我无法提取预期的通知数据。
基于概念:FCM中有两种类型的消息:
display-messages:这些消息仅在您的应用程序处于前台时有效。
data-messages:即使您的应用程序处于后台,这些消息仍然有效 当我们的应用程序在后台时,Android 将通知消息定向到系统托盘。
为了处理 数据消息 你的通知应该有 click_action = "YOUR_ACTION" 字段。
我的留言会是这样的:
{
"data": {
"body": "here is body",
"title": "Title",
"click_action": "YOUR_ACTION"
},
"to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb"
}
Activity 将显示清单文件如下所示的消息:
<activity
android:name=".NotificationActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Dialog"
android:windowSoftInputMode="stateHidden" >
<intent-filter>
<action android:name="YOUR_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
点击通知后,它将重定向到我的 NotificationActivity
。在我的 NotificationActivity
in onCreate
和 onNewIntent
方法中,我使用这种方式提取消息:
Bundle bundle=getIntent().getExtras();
if(bundle!=null) {
for (String key : bundle.keySet()) {
Object value = bundle.get(key);
Log.d("DATA_SENT", String.format("%s %s (%s)", key,
value.toString(), value.getClass().getName()));
}
}
不幸的是,在我的 NotificationActivity
中,我收到以下消息:
google.sent_time: 1471631793774
来自:50711789666
google.message_id 0:1471631793776823%098e508d098e508d
collapse_key: com.myapp.package_name
但是我预期的通知数据在哪里?
这是我的系统配置:
Android 工作室版本: 2.1.3
Firebase 版本: com.google.firebase:firebase-auth:9.0.1
Google 播放服务版本 : com.google.android.gms:play-services:9.2.1
以下是一些相关链接:
- https://github.com/firebase/quickstart-android/issues/4
- https://github.com/firebase/quickstart-android/issues/47
提前致谢。抱歉英语不好。
上面android的解法是正确的。实际上,问题出在通知消息上。它向我发送 "data" 对象而不是 "notification" 对象。我的 TargetActivity
中缺少 "notification" 对象没有使用 getIntent()
收到消息。发送 "notification" 对象后,它解决了我的问题。
正确的消息格式如下:
{
"data": {
"body": "here is body",
"title": "Title"
},
"notification": {
"body": "here is body",
"title": "Title",
"click_action": "YOUR_ACTION"
},
"to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb"
}
这里是关于 firebase 消息的更清晰的概念。我是从他们的支持团队那里找到的。 Firebase 具有三种消息类型:
通知消息 : 通知消息在后台或前台工作。当应用程序处于后台时,通知消息会传送到系统托盘。如果应用程序在前台,则消息由 onMessageReceived() 或 didReceiveRemoteNotification 回调处理。这些本质上就是所谓的显示消息。
数据消息:在Android平台上,数据消息可以在后台和前台工作。数据消息将由 onMessageReceived() 处理。 此处的平台特定说明是:在 Android 上,可以在用于启动 activity 的 Intent 中检索数据有效负载。详细来说,如果你有 "click_action":"launch_Activity_1",你可以通过 getIntent() 从 Activity_1 中检索这个意图。
具有通知和数据负载的消息: 在后台时,应用程序在通知托盘中接收通知负载,并且仅在用户点击通知时处理数据负载。 在前台时,您的应用程序会收到一个消息对象,其中包含两个有效负载。 其次,click_action 参数通常用于通知有效载荷而不是数据有效载荷。如果在数据负载中使用,此参数将被视为自定义键值对,因此您需要实现自定义逻辑才能使其按预期工作。
此外,我建议您使用 onMessageReceived
方法(参见数据消息)来提取数据包。根据你的逻辑,我检查了 bundle 对象并没有找到预期的数据内容。这是对类似案例的参考,可能会更清楚。