Firebase FCM通知已发送但Android端未接收(iOS端正常)
React Native FCM集成问题:Android端无法接收通知
我在React Native应用中集成Firebase Cloud Messaging(FCM),iOS端通知运行正常,但Android设备完全无法接收通知。FCM控制台显示186条已发送,0条已接收,且Android设备在前台、后台甚至进程被杀状态下都没有通知显示。
已尝试的调试步骤
- 确认设备能正常获取FCM令牌并存储到后端,示例令牌:
eGZN_UEfQiueuOAIuyQyNa:APA91bH... - 通过cURL和Firebase Admin API发送测试消息,API返回成功响应(示例:
Message name: projects/picksleague/messages/0:1741651045657907%e6031bc4e6031bc4),但设备无通知显示 - 使用命令
adb logcat -s FirebaseMessaging查看日志,发送通知时无任何日志输出,FirebaseMessagingService未触发 - 已实现
MyFirebaseMessagingService,但onMessageReceived()内的日志从未打印 - 检查
AndroidManifest.xml,已声明该服务并配置com.google.firebase.MESSAGING_EVENT意图过滤器 - 通过命令
adb shell dumpsys package com.pb_mobile_app | grep RECEIVE确认com.google.android.c2dm.permission.RECEIVE等权限已授予 - 检查
android/app/build.gradle中的Firebase依赖,已使用firebase-bom版本32.7.3及firebase-messaging - 执行命令
adb shell dumpsys activity services | grep FirebaseMessagingService,确认服务正在运行但未触发
问题解答
1. 为何Firebase显示通知已发送,但Android设备无通知?
FCM显示“已发送”仅代表消息成功推送到FCM服务器,不代表设备实际接收。核心原因可能包括:
- 消息类型不匹配:若发送的是仅含
notification字段的通知消息,Android系统会直接处理,不会触发onMessageReceived();应用进程被杀时,厂商ROM的后台管控(如电池优化、进程限制)可能直接拦截通知。 - 令牌有效性问题:虽然能获取令牌,但设备重置、应用卸载重装后,旧令牌可能与设备绑定关系失效,导致消息无法送达。
- 厂商ROM限制:国内Android厂商(小米、华为、OPPO等)对后台服务和推送有严格管控,FCM服务可能被强制休眠,无法维持持久连接接收消息。
2. 如何调试MyFirebaseMessagingService.onMessageReceived()未触发的问题?
- 发送数据消息测试:构造仅含
data字段的测试消息,无论应用处于前台还是后台,onMessageReceived()都会被触发,以此验证服务是否正常工作。示例cURL请求:curl -X POST "https://fcm.googleapis.com/fcm/send" \ -H "Authorization: key=YOUR_SERVER_KEY" \ -H "Content-Type: application/json" \ -d '{ "to": "DEVICE_TOKEN", "data": { "title": "测试数据消息", "body": "这是一条数据消息", "click_action": "FLUTTER_NOTIFICATION_CLICK" } }' - 扩大日志范围:除
FirebaseMessaging标签外,用adb logcat | grep "Firebase"或adb logcat | grep "C2DM"查看更宽泛的日志,排查FCM相关的错误或拦截信息。 - 验证服务注册:在
MyFirebaseMessagingService的onCreate()方法中添加日志,确认服务是否初始化;同时检查AndroidManifest.xml中服务声明的包名、意图过滤器是否正确:<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
3. 还需检查哪些项来排查Android无法接收FCM消息的原因?
- 电池优化设置:将应用加入电池优化白名单(路径一般为「设置 > 电池 > 电池优化 > 找到应用 > 设置为不优化」)。
- 厂商推送权限:检查是否开启应用的通知权限、后台弹出权限;部分厂商需在自家推送平台(如小米推送、华为推送)配置,确保FCM消息能正常透传。
- FCM初始化状态:在应用启动时通过
FirebaseMessaging.getInstance().getToken()的回调日志确认初始化是否成功,若失败会抛出异常。 - 设备网络状态:确保设备处于稳定网络环境,FCM需要持久连接,代理网络或不稳定网络可能导致消息无法接收。
- 依赖版本兼容性:确认
firebase-bom版本与React Native Firebase库版本兼容,避免版本不匹配导致初始化失败。 - 应用签名校验:检查Firebase控制台中配置的SHA-1值与应用打包使用的debug、release签名是否一致,FCM依赖签名校验绑定设备。
内容的提问来源于stack exchange,提问作者Kostas Drosatos
相关产品推荐
相关产品推荐

