我在后台应用程序中无法再收到任何 FCM 消息

Posted

技术标签:

【中文标题】我在后台应用程序中无法再收到任何 FCM 消息【英文标题】:I cannot receive any FCM message anymore in background application 【发布时间】:2016-07-22 11:01:24 【问题描述】:

当应用程序处于后台时,我无法再在应用程序中接收任何数据消息。 请注意,直到最近它才在我的应用程序中完美运行。也许它在我的开发环境最近更新后停止工作,我不能说....

所以我尝试使用quickstart-android project 进行测试,看看效果更好。

答案是否定的!

我毫不怀疑 quickstart-android 项目配置良好以使用 FCM 功能...

我从 Advanced REST Client 发送了以下消息,我成功地使用它来测试我当前发布的应用程序。


  "to" : "dLN4paNl3uw:APA91bH0lpkEMxGp...._7EdxkB2cRbPKFxT2Ti3OPw-7fCSwXCSfGG",
  "data": 
    "id": 19,
    "title": "Title test",
    "msg": "Text of the test",
    "code": 2,
  ,
  "delay_while_idle" : false,
  "priority" : "high",
  "content_available" : true

我能说的是,每当我在应用程序处于后台时发送消息时,我都会在 logcat 中得到以下显示

07-22 12:54:21.400 14316-14316/? W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent  act=com.google.android.c2dm.intent.RECEIVE flg=0x10000000 pkg=com.google.firebase.quickstart.fcm (has extras) 

所以消息被设备很好地接收了,但没有传输到 onMessageReceive()。

我看到很多关于此类问题的帖子,但答案总是含糊不清,因为我们可以说它对某些人有效,对另一些人无效。 所以我想知道最近是否有人对这个问题找到了更准确的解释,因为我想知道它是否不能来自开发环境,因为我试图用新更新的工作室、sdk、构建工具和我遇到了同样的问题,新建的应用程序不再接收 GCM/FCM 消息。

编辑

经过更多调查,我在 logcat 中看到,当我从最近的应用程序列表中刷出我的应用程序时,我的应用程序被强制关闭。这当然说明它无法处理设备收到的消息。

07-23 23:12:29.002 671-31254/? I/ActivityManager: Killing 17453:com.google.firebase.quickstart.fcm/u0a297 (adj 9): remove task
07-23 23:12:29.016 14316-14524/? D/GCM: Removing messenger 0:com.google.firebase.quickstart.fcm
07-23 23:12:29.017 671-2998/? I/WindowState: WIN DEATH: Window2a27cf7 u0 com.google.firebase.quickstart.fcm/com.google.firebase.quickstart.fcm.MainActivity
07-23 23:12:30.148 671-4851/? I/ActivityManager: Force stopping com.google.firebase.quickstart.fcm appid=10297 user=0: from pid 18289

我还尝试了我几周前构建的一个工作项目,它基于 GCM 8.4.0、sdk 23、java 1.7,它正在工作,但我遇到了同样的问题;应用程序被强制关闭。

这是在我成功用于测试我的工作项目的 2 个不同设备上观察到的:nexus 7 LTE 6.0.1 和 GT-9295 5.0.1 我现在看到的唯一区别是 Android Studio/gradle 的版本。工作项目是用 1.5.2 构建的,现在我使用 2.1.2,我不能再构建任何工作应用程序了。 我在两台不同的计算机上遇到了这个问题,我在其中一台上重新安装了所有东西!

【问题讨论】:

【参考方案1】:

FCM 有两种类型的通知 Silent 和 Non-Silent:-

静默通知 :- 你总是在 onMessageReceived 方法中得到回调

非静默通知:- 当应用程序在前台时,您会在 onMessageReceived 方法中收到回调,但当应用程序在后台时,FCM 会在通知栏中生成默认通知。

只有数据部分的通知在 FCM 中被视为静默通知。

当您从服务器生成通知时,您会传递一个类似的 JSON 对象:-


  "notification":
    "title":"Test Notification",
    "body":"Notification is delivered!",
    "sound":"call",
    "icon": "ic_app_icon"
  ,
  "data":
    "someData":"Great"
  ,
  "to": "app_token",
  "priority":"high"

如果你想从服务器发送静默通知,上面的通知是一个非静默通知,那么结构应该是这样的:-


  "data":
    "someData":"Great"
  ,
  "to": "app_token",
  "priority":"high"

您可以使用相同的结构,只是在有效负载中没有通知对象。

【讨论】:

好的,但正如我所说,问题不是来自我的代码,而是来自 Android Studio。出于任何未知原因,如果我使用 Android Studio 2 构建我的应用程序,我无法让它工作,但当我使用 Android Studio 1.5 code.google.com/p/android/issues/detail?id=219084 构建它时,它却完美无缺【参考方案2】:

太不可思议了

我重新安装了 Android Studio 1.5 捆绑包 141.2422023、sdk 23.0.3、java jdk1.7.0_79 并重建了 Firebase quickstart-android 消息传递应用程序,结果惊人

当我将应用程序置于后台时,我不再有 Force stopping 消息:

07-24 12:00:10.409 671-3321/? I/ActivityManager: Killing 11067:com.google.firebase.quickstart.fcm/u0a297 (adj 9): remove task
07-24 12:00:10.425 671-31254/? D/GraphicsStats: Buffer count: 4
07-24 12:00:10.425 671-31254/? I/WindowState: WIN DEATH: Window996cbf7 u0 com.google.firebase.quickstart.fcm/com.google.firebase.quickstart.fcm.MainActivity

并且应用程序正在正确接收和处理数据负载消息

我还成功地在 Studio 1.5.2 下使用 sdk 24、buildtools 24.0.0 和 java 1.8.0_92 重建了应用程序

请告诉我,从 Studio 1.5 迁移到 Studio 2.1.2 时,应用程序中是否有一些重要的更改!

【讨论】:

从 1.5 到 2.1 的变化不会对您的项目产生这种影响。您是否对 quickstart-android 消息传递项目进行了任何调整?如果你做一个 git status 有什么变化吗? @ArthurThompson no Arthur,正如我在GitHub 上所说并深入解释了here :-/【参考方案3】:

我也看到了这个错误,也是使用 Android Studio 2.1,发现了这个:

当您退出 Android Studio 时,它会终止应用(正在调试)并将其置于某种“停止”状态。

这与从最近删除的消息不同,如果我这样做,那么我的 GCM 消息可以正常通过。

但是这个循环——使用 AS 调试、退出 AS、应用程序被杀死——导致 GCM 消息传递失败并显示 result=CANCELLED forIntent

【讨论】:

我真的没有看到。对我来说,它实际上并不依赖于 Android Studio 状态。我可以在没有连接的情况下从设备启动应用程序,并且在接收 FCM 消息的能力方面我得到了相同的行为。【参考方案4】:

我希望您将此类数据添加到您的 Web API 中。

$fields = array(
    'to'                        => $reg_id ,
    'priority'                  => "high",
    'notification'              => array( "title"=>"Food Shop", "body" => $message , "click_action"=> "OPEN_ACTIVITY_1"),
    'data' => array(
            "noti_title"=>"Food Shop One",
            "noti_body"=> "some body"
          ),
);

【讨论】:

以上是关于我在后台应用程序中无法再收到任何 FCM 消息的主要内容,如果未能解决你的问题,请参考以下文章

Android 应用在收到新的 FCM 消息时崩溃(前台和后台)

如何在后台控制 FCM 消息通知 [重复]

如何在应用程序处于后台(ios)时使 FCM 通知正常工作?

我收到消息,但它们不会显示在状态栏上(我的应用程序在后台100%)

iOS 模拟器或物理设备未收到 FCM 数据消息

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