You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:12:41