Flutter项目Firebase Messaging通知延迟消失、发送失败问题求助
问题分析与解决方案
可能的原因
- 通知类型差异:如果发送的是纯数据消息,而非系统级的通知消息,App后台时系统不会持久化通知,进程被回收后通知会直接消失;只有通知消息会由系统托盘托管,稳定性更高。
- 系统后台限制:Android厂商(小米、华为、OPPO等)的电池优化、后台进程限制会杀死Firebase Messaging的推送进程,导致通知延迟或丢失;iOS的后台刷新权限未开启也会影响投递。
- 通知优先级过低:发送时优先级设置为
normal(Android)或5(iOS),系统会在资源紧张时延迟投递甚至丢弃通知。 - 配置/权限缺失:
google-services.json/GoogleService-Info.plist配置错误、未请求推送权限(如Android 13+的POST_NOTIFICATIONS权限)会导致通知无法正常送达。 - 网络与TTL限制:设备离线时通知暂存于Firebase服务器,超过TTL(默认4周)会被丢弃;弱网环境下也会出现延迟投递。
优化措施与解决方法
1. 正确使用通知消息类型
优先发送通知消息(或通知+数据负载的组合),由系统托盘处理展示,避免纯数据消息依赖App进程存活。Flutter中处理通知的示例:
FirebaseMessaging.onMessage.listen((RemoteMessage message) { RemoteNotification? notification = message.notification; AndroidNotification? android = message.notification?.android; if (notification != null && android != null) { flutterLocalNotificationsPlugin.show( notification.hashCode, notification.title, notification.body, NotificationDetails( android: AndroidNotificationDetails( channel.id, channel.name, channel.description, icon: android.smallIcon, ), ), ); } });
2. 解除系统后台限制
- Android:引导用户将App加入电池优化白名单、开启自启动权限,可通过代码跳转设置页:
await AndroidIntent( action: 'android.settings.APPLICATION_DETAILS_SETTINGS', data: 'package:$packageName', ).launch(); - iOS:确保开启“后台App刷新”,并在
Info.plist中添加UIBackgroundModes包含remote-notification。
3. 设置高优先级通知
- Android:发送时指定
priority: "high"或priority: "max"; - iOS:设置
apns-priority: 10(即时投递);
服务器端发送示例(Firebase Admin SDK):
const message = { notification: { title: '紧急通知', body: '这是一条高优先级推送' }, android: { priority: 'high' }, apns: { headers: { 'apns-priority': '10' }, payload: { aps: { sound: 'default' } } }, token: registrationToken };
4. 检查配置与权限
- 确认
google-services.json/GoogleService-Info.plist的包名/Bundle ID与Firebase控制台完全一致; - Android 13+主动请求通知权限:
if (Platform.isAndroid) { await FirebaseMessaging.instance.requestPermission( alert: true, badge: true, sound: true ); await Permission.notification.request(); } - iOS在
Info.plist中添加NSUserNotificationUsageDescription权限描述,并请求推送权限。
5. 优化网络与TTL设置
- 根据业务需求调整通知TTL,延长离线设备的通知保留时间;
- 确保设备网络稳定,避免频繁切换网络导致通知丢失。
内容的提问来源于stack exchange,提问作者Emir Bolat
相关产品推荐
相关产品推荐

