当应用程序处于后台状态时,Google FCM getIntent 未返回预期数据

Posted

技术标签:

【中文标题】当应用程序处于后台状态时,Google FCM getIntent 未返回预期数据【英文标题】:Google FCM getIntent not returning expected data when app is in background state 【发布时间】:2016-12-27 00:59:45 【问题描述】:

我正在我的应用程序中实现 FCM(Firebase 消息传递服务)。这里一切似乎都很好,除非当应用程序处于后台状态时,我无法提取预期的通知数据。

基于概念:FCM 中有两种类型的消息:

display-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 会显示 manifest 文件如下所示的消息:

<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 。在我的NotificationActivityonCreateonNewIntent 方法中,我正在使用这种方式提取消息:

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 Studio 版本:2.1.3

Firebase 版本:com.google.firebase:firebase-auth:9.0.1

Google Play 服务版本: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 How to handle notification when app in background in Firebase Firebase onMessageReceived not called when app in background How to handle notification when app in background in Firebase

提前致谢。抱歉英语不好。

【问题讨论】:

能否请您发布您的 onMessageReceived 方法?我认为问题可能出在该方法上,因此您的 NotificationActivity 没有收到通知数据。 【参考方案1】:

上面的android解决方案是正确的。实际上,通知消息是问题所在。它向我发送“数据”对象而不是“通知”对象。我的TargetActivity 中缺少“通知”对象没有使用getIntent() 收到消息。发送“通知”对象后,它解决了我的问题。

正确的消息格式如下:


 "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 上,可以在用于启动您的活动的 Intent 中检索数据有效负载。详细地说,如果你有 "click_action":"launch_Activity_1",你可以通过 getIntent() 仅从 Activity_1 中检索这个意图。

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

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

【讨论】:

正确。您也可以在 Firebase 控制台中执行此操作。在 Advanced options 下填写 custom data 作为键值对。然后,就可以从intent.getExtra()获取数据了; 很高兴您找到了解决方案。您能否编辑原始问题以澄清“显示消息:这些消息仅在您的应用程序处于前台时才有效”段落。 “显示消息是:如果应用程序在后台,则在通知托盘中自动显示,如果应用程序在前台,则触发 onMessageReceived()。” ?请参阅:firebase.google.com/docs/cloud-messaging/… 非常感谢,如果有不清楚的地方,请继续提问! 当您的应用程序处于后台并且您的通知将由 FCM 自动生成时,您将如何向任何活动发送数据? 在 menifest.xml 的目标活动中添加意图过滤器 在您的目标活动中从意图中获取捆绑包。捆绑 b = getIntent().getExtras(); String someData = b.getString("someData");

以上是关于当应用程序处于后台状态时,Google FCM getIntent 未返回预期数据的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序处于后台状态时,FCM 多个推送通知无法正常工作

当应用程序处于后台状态时,FCM多次推送通知无法正常工作

FCM点击应用处于后台状态时如何打开用户指定的活动而不是默认活动

FCM 点击如何在应用程序处于后台状态时打开用户指定的活动而不是默认活动

当应用程序处于后台时,我的 FCM 通知不会展开

当应用程序处于后台/终止并收到 FCM 通知时,如何在 Flutter 中显示本地通知?