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

3
当我的应用程序在后台运行时,我无法再接收任何数据消息。请注意,直到最近我的应用程序都运行良好。可能是由于最近在我的开发环境中进行的更新之后停止工作了,我无法确定...
因此,我尝试使用quickstart-android项目进行测试,看看它是否可以更好地工作。
答案是否定的!
我毫不怀疑quickstart-android项目已经完全配置为使用FCM功能...
我从高级REST客户端发送了以下消息,我目前成功使用它来测试我的应用程序。
{
  "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()。我看到了许多关于这个问题的帖子,但答案总是含糊不清,因为我们能说的是它对一些人有效,而对其他人无效。因此,我想知道是否有人最近对这个问题有了更精确的解释,因为我想知道它是否可能来自开发环境,因为我尝试使用新更新的studio、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: Window{2a27cf7 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构建的,当时它是可以工作的,但现在我遇到了同样的问题:应用程序强制关闭。我在两个不同的设备上测试过我的工作项目:nexus 7 LTE 6.0.1和GT-9295 5.0.1。唯一的区别是Android Studio/gradle的版本。之前工作的项目是使用1.5.2构建的,而现在我使用的是2.1.2,我再也无法构建任何可工作的应用程序了。我在两台不同的计算机上都遇到了这个问题,在其中一台计算机上我甚至重新安装了所有东西!
4个回答

4

FCM有两种类型的通知:静默通知和非静默通知:

静默通知:您始终会在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构建它时,它可以完美地工作。https://code.google.com/p/android/issues/detail?id=219084 - fralbo

0

我也遇到了这个错误,同样使用的是Android Studio 2.1,并发现了以下问题:

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

这与从最近使用中滑动关闭不同,如果我只是这样做,那么我的GCM消息就可以正常传递。

但是这个循环——使用AS进行调试,退出AS,应用程序被杀死——会导致GCM消息传递失败,出现result=CANCELLED forIntent的错误。


我并没有真正看到。对我来说,实际上并不取决于Android Studio的状态。我可以从设备上启动应用程序,而无需连接,我在接收FCM消息方面得到相同的行为。 - fralbo

0

我希望你能在你的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"
          ),
);

0

这太不可思议了

我重新安装了Android Studio 1.5捆绑包141.2422023,sdk 23.0.3,java jdk1.7.0_79,并重建了Firebase快速入门-Android消息应用程序,结果令人惊讶

当我将应用程序放在后台时,我不再收到强制停止的消息:

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: Window{996cbf7 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没有任何变化会对您的项目产生这种影响。您是否对快速入门Android消息项目进行了任何调整?如果执行git状态,是否有任何更改? - Arthur Thompson
@ArthurThompson 不是的,Arthur,正如我在GitHub上所说,并在这里深入解释的那样 :-/ - fralbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接