Firebase Cloud Messaging (FCM) 推送常见问题汇集

近期一直在做Google的FCM推送工作,遇到不少坑,也遇到各种神奇事情.项目最近出街了,终于有空总结一下,算是造福国内开发者吧,FCM在国内的讨论相对比较少.
本文旨在描述常见问题,并非开发guide

汇总

  1. Q: APP为什么有时候能够收到消息,有时候收不到消息?
    A: FCM 分为两种接收消息的方式,前台接收后台接收.

    FCM 传送主题消息的方式与传送其他下行消息的方式相同。[1]
    如需接收消息,请使用继承 FirebaseMessagingService 的服务。 您的服务应该重写 onMessageReceivedonDeletedMessages 回调方法。该服务应在收到消息后 20 秒内对其进行处理(Android Marshmallow 上为 10 秒)。这个时长可能会更短,具体取决于调用 onMessageReceived 之前发生的操作系统延迟。这个时间段过后,各种操作系统行为(如 Android O 的后台执行限制)可能会影响您完成工作的能力。如需了解详情,请参阅我们的消息优先级概述。
    大多数类型的消息都会提供 onMessageReceived,但以下情况例外:

    • 当应用在后台时送达的通知消息。在这种情况下,通知将传送至设备的系统任务栏。默认情况下,用户点按通知即可打开应用启动器。

    • 在后台所接收的同时具备通知和数据载荷的消息。 在这种情况下,通知将传送至设备的系统任务栏,数据载荷则传送至启动器 Activity 的 intent 的 extras 属性中。

      前台/后台接收推送区别

  2. Q: 为什么我按照答案1做完之后还是不行?
    A: 请检查推送过来的数据格式是否正确,正确的格式应该是以下这样的[2]
    包含 notificationdata ,需要显示的 titlebody 应该包含在 notification里面,不要放到其他地方. 如果只在 data 那里有内容, notification 那里没有内容的话, 一般是不会收到消息的. [4]

    请确保未在自定义键值对中使用任何保留字词。保留字词包括 “from”、“notification”、“message_type” 或以 “google” 或 “gcm” 开头的任何字词。

       {
         "message":{
           "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
           "notification":{
             "title":"Portugal vs. Denmark",
             "body":"great match!"
           },
           "data" : {
             "Nick" : "Mario",
             "Room" : "PortugalVSDenmark"
           }
         }
       }
    
  3. Q: 为什么Debug的时候发现能够收到消息,但是没有去到onMessageReceived?
    A: 后台收到消息的话,不会去onMessageReceived,而是走后台的方式.更多参考问题1

  4. Q: 为什么开了VPN还是拿不到 firebase token?
    A: 不是所有VPN都可以成功拿到firebase token. 目前来说,Lantern是已知拿到firebase token成功率比较高的VPN工具.
    具体验证方法,打开VPN后,能够打开Google Play Store,并成功浏览的VPN,一般无问题.

  5. Q: 为什么某些手机关了APP后总是收不到消息?
    A:

    • 请看答案2

    • 有些第三方厂商会设置电源模式,会限制APP的通讯,可以打开电源管理,之后选择[无限制]后再去尝试,还有[自启动]管理,需要都打开(已知厂商: 华为/OPPO/小米),小米打开[自启动]即可收到消息. [7]
      具体验证方法如下:

      输入adb shell dumpsys package "包名" | grep stopped
      之后console输出User 0: ceDataInode=249503 installed=true hidden=false suspended=false distractionFlags=0 stopped=true notLaunched=false enabled=0 instant=false virtual=false
      如果stoppedtrue,则收不到的,如果stoppedfalse则是可以收到的.

    • 如果是中国国内的手机,不是所有国内手机都有安装GMS,没有安装GMS套装的手机,kill APP后的确不会接收FCM的消息推送.

    • FCM的推送率其实也不是百分百的,不要给PO/BA打包票

    • 部分国行三星机器会因为功率原因,会block FCM server,留意留意!

  6. Q: 为什么接收消息的图标不对,显示为一个灰色的图标,或者显示为APP的图标icon?
    A: 当后台接收消息时,会使用默认的图标,没有的话会使用APP的icon.
    将以下代码行添加到 application 标记内,以设置自定义默认图标和颜色:

<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
     See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
     notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />
  1. Q: 设置了图标是彩色的,推送过来后显示的图标是一片灰色的?
    A: 叫UI designer 提供灰色透明底的PNG图片,之后再去set color即可.
    NotificationCompat.Builder().setColor()

  2. Q: 为什么通过postman FCM server 推送消息给手机, 试着试着手机就收不到了?
    A: 不要经常发同一内容的消息到同一台手机,会被FCM block的.可以改一改推送内容,又或者卸载APP(firebase token会改变)再重装即可.

  3. Q: 为什么kill APP后,已经收到的消息会消失(即在系统通知栏中的消息会消失)?
    A: 这是部分厂商的行为,淘宝/微博国际版也是一样.已知厂商:小米/三星
    部分厂商应该是对NotificationManager做了一些处理导致的,APP可以做的就只能搞很复杂的跨进程推送.

  4. Q: 为什么本地build的开发APP无问题,实际生产环境就收不到推送?
    A: 请保证包名无问题,实际生产环境使用的推送key也是对应production包名用的key

参考文档

  1. 接收和处理主题消息
  2. 数据格式结构
  3. 修改应用清单
  4. Firebase(FCM) notifications not coming when android app removed from recent tray
  5. Firebase push notification issue in Android when app is closed/killed
  6. Can Firebase console push notification if apps is closed?
  7. Can Firebase console push notification if apps is closed? -- Firebase 官方回答
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容