关于FCM(Firebase Cloud Messaging)无法收到推送的问题

发布时间 2023-04-24 17:18:07作者: muhoor

这几天在接FCM(Firebase Cloud Messaging),碰到了一些坑,记录一下

一、通过近期任务划掉app后无法收到推送,提示broadcast intent callback: result=CANCELLED

stackoverflow上面的答案五花八门,什么都有,国内搜出来的也是很凌乱,导致凌乱的原因其实就是国内外系统不一致,所以大家的说法听起来是完全不一样的,下面分别用国内外两个版本的手机做测试:

1、三星手机国外版本:

划掉app后依然能够接收fcm推送,但是在应用程序信息中【强制停止】后无法接收fcm推送,谷歌的回答是:
当您的应用程序被强制停止或终止时,您似乎遇到了问题。
实际上,这是按预期工作的。
Android 框架建议,在没有明确的用户交互的情况下,不应启动已停止(即从设置中终止/强制停止)的应用程序。
FCM 遵循此建议,因此其服务也不会启动。
这也意味着当应用程序处于“已终止”状态时,将不会收到消息(不会调用 FirebaseMessagingService)

2、红米K30国内版本:

划掉app后无法接收fcm推送,在应用信息中开启【自启动】后能够正常接收推送。

推测结论是:

国内版本的安卓通过近期任务划掉app实际就是【强制停止】,可以引导用户去开启自启动,达到正常推送,不过既然是国内版本为啥用FCM呢?还得装谷歌套件。而国外版本的安卓用户通常不会进入应用程序信息中强制停止app,所以这个也不是什么大问题,并且谷歌也明确不支持这么做,如果你一定要在【强制停止】之后还能接收FCM推送的话,我这里也没答案,毕竟这里只是把混乱的情况理清楚。

二、Android12无论前台后台都无法收到fcm推送

一台三星S10接收推送的时候报了下面的错误,Android系统版本是12
Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent. Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
搜出来的各种结论是让你改代码,可报错的堆栈信息是直接在firebase里面,看了一眼Firebase-bom的版本号,发现是比较古老的了,升级到最新的就ok了
implementation platform('com.google.firebase:firebase-bom:26.2.0')
改为
implementation platform('com.google.firebase:firebase-bom:31.4.0')