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
相关产品推荐
相关产品推荐

