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

Flutter集成FCM后长时间后台运行无法接收通知

解决Flutter FCM长时间待机后无法接收通知的问题
  • 检查设备电池优化与后台权限
    安卓厂商的电池优化机制是重灾区——长时间待机后,系统会自动杀死后台进程,包括FCM的推送服务。去设备「设置-电池」里,找到你的应用:

    • 把电池优化设为「不允许」
    • 开启「后台活动权限」「自启动权限」,部分厂商叫「应用保活」,一定要加白名单
  • 确保FCM令牌实时同步
    待机期间FCM令牌可能会刷新,但如果你的服务器没拿到新令牌,推送自然发不到设备。要做两件事:

    • 应用启动时主动调用FirebaseMessaging.instance.getToken(),对比服务器存储的令牌,不一致就更新
    • 监听令牌刷新事件,自动同步到服务器:
      FirebaseMessaging.instance.onTokenRefresh.listen((newToken) {
        // 这里写同步到服务器的逻辑
      });
      
  • 检查后台消息处理逻辑
    FirebaseMessaging.onBackgroundMessage这个回调必须是顶级函数,而且不能用任何Flutter插件(后台隔离环境不支持),只能用纯Dart代码。如果回调里有未捕获的异常或者耗时操作,会导致FCM服务被系统终止,直接崩掉推送通道。

  • 核对AndroidManifest配置
    别漏了FCM的核心配置:

    • 确认FirebaseMessagingService的声明正确:
      <service
        android:name=".MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
          <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
      </service>
      
    • 加上RECEIVE_BOOT_COMPLETED权限,保证设备重启后能重新注册FCM:
      <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
      
  • 区分通知类型测试
    FCM分「通知消息」和「数据消息」:

    • 通知消息由系统托盘处理,后台时容易被系统拦截
    • 数据消息需要应用自己处理,优先级更高
      试试发一条数据消息测试,结构大概是:
      {
        "to": "你的设备令牌",
        "data": {
          "title": "测试数据推送",
          "body": "看看能不能收到"
        }
      }
      

    如果数据消息能收到,说明是系统对通知消息的限制问题,可以考虑用数据消息自己构建通知。

  • 排查网络低功耗模式
    长时间待机后设备可能进入低功耗网络模式,FCM的长连接会断。可以在应用里监听网络状态变化,一旦恢复网络就重新获取令牌,确保推送通道正常。

内容的提问来源于stack exchange,提问作者Mahmoud Khaled

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:55:56