同一设备运行两个FCM Android应用部分推送无法送达求助
我来给你梳理几个针对这个问题的排查方向,都是基于FCM在多应用共存场景下的常见坑点:
1. 优先升级Firebase Messaging SDK版本
你当前使用的com.google.firebase:firebase-messaging:11.4.2是比较早期的版本,Android 7+引入的后台限制以及多应用FCM共存的一些已知bug,在后续的SDK版本中已经有不少修复。建议先尝试升级到较新的稳定版本(比如至少升到20.x以上,或者官方最新的稳定版),很多这类推送丢失的问题都是旧版本的兼容性问题导致的。
2. 排查Android 7+的后台优化限制
Android 7(API 24)及以上对后台服务和广播接收器有严格的限制,尤其是Doze模式和App Standby,会直接影响FCM推送的送达:
- 将两个应用都加入系统的「忽略电池优化」列表,测试推送是否恢复正常;
- 通过
adb shell dumpsys activity processes命令查看应用进程状态,确认应用是否被系统杀死; - 区分通知消息和数据消息:通知消息由系统级FCM服务处理,受后台限制影响更小;而数据消息需要应用进程存活才能处理,容易被系统拦截。如果你的推送是数据消息,建议改为通知消息,或者结合前台服务来保证进程存活。
3. 验证两个应用的FCM配置独立性
因为两个应用分属不同Firebase项目,必须确保各自的配置完全独立且正确:
- 检查每个应用的
google-services.json文件,确认project_id、google_app_id、api_key等字段和对应Firebase项目完全匹配; - 清单文件中,自定义的
FirebaseMessagingService实现是否在各自应用中独立声明,没有出现跨应用的配置混淆; - 确认两个应用的包名完全不同,FCM是绑定包名与项目的,包名重复会直接导致令牌冲突和推送异常。
4. 确认推送目标令牌的有效性
同一设备上的两个应用会生成独立的FCM令牌,推送时必须确保目标令牌正确对应:
- 在每个应用中添加日志,打印各自的FCM令牌,确认两个令牌完全不同;
- 在Firebase控制台发送测试推送时,选择对应项目的应用,输入正确的令牌,验证是否能正常接收;
- 检查服务器端的推送逻辑,是否存在令牌混淆的情况(比如把A应用的令牌发给了B项目的推送服务)。
5. 检查设备的Google Play Services版本
FCM的正常运行依赖设备上的Google Play Services,旧版本的Play Services可能无法正确处理多应用的FCM请求。确保设备上的Google Play Services版本不低于你使用的Firebase SDK版本(11.4.2对应的Play Services至少要11.4.2以上),建议升级到最新版本。
6. Android 8+的通知渠道配置检查
如果测试设备是Android 8(API 26)及以上,必须为每个应用创建专属的通知渠道,否则通知会被系统拦截:
- 检查每个应用中是否有创建通知渠道的代码(比如在应用启动或
FirebaseMessagingService的onCreate方法中); - 进入系统设置,查看两个应用的通知渠道是否存在,且未被禁用。
7. 利用日志和FCM诊断工具排查
- 使用
adb logcat过滤FCM相关日志(关键词:FirebaseMessaging、GCM),查看是否有推送接收失败的错误信息,比如令牌无效、权限不足、系统拦截等; - 在Firebase控制台的Cloud Messaging模块,查看消息发送的状态报告,确认消息是否被成功送达设备,是否存在异常状态。
内容的提问来源于stack exchange,提问作者maheryhaja
相关产品推荐
相关产品推荐

