Firebase Cloud Messaging通知无法堆叠,新通知覆盖旧通知求助
FCM通知被覆盖问题的解决方案
你遇到的问题核心是通知tag未真正实现唯一性,或是系统自动处理notification payload时的逻辑限制。以下是具体排查和解决方法:
1. 确保Tag绝对唯一
先验证createTag(3)生成的字符串是否每次都不同。如果生成逻辑存在重复风险(比如固定长度随机字符串有碰撞概率),改用更可靠的唯一标识:
- 使用时间戳:
DateTime.now().millisecondsSinceEpoch.toString() - 使用UUID:通过
uuid包生成(需先在pubspec.yaml添加依赖)
修改后的代码示例:
// 生成绝对唯一的tag String uniqueTag = DateTime.now().millisecondsSinceEpoch.toString(); final data = { 'click_action': 'FLUTTER_NOTIFICATION_CLICK', 'status': 'done', 'message': title, 'body' : body, }; try{ http.Response response = await http.post(Uri.parse('https://fcm.googleapis.com/fcm/send'), headers: <String, String>{ 'Content-Type': 'application/json', 'Authorization': 'key=MY_CODE' }, body: jsonEncode(<String, dynamic>{ 'notification': <String, dynamic> { 'title': title, 'body': body, 'android_channel_id':'dbfood', "tag" : uniqueTag // 替换为唯一tag }, 'priority': 'high', 'data': data, 'to': token }) ); if(response.statusCode != 200){ print("Error"); } }catch(e){ print(e.toString()); }
2. 改用Data消息+手动展示通知
FCM的notification payload由系统自动展示,部分场景下可能忽略tag逻辑。改用data消息并在Flutter端手动触发通知,可完全控制通知展示行为:
发送端修改(仅传data字段)
String uniqueTag = DateTime.now().millisecondsSinceEpoch.toString(); final data = { 'click_action': 'FLUTTER_NOTIFICATION_CLICK', 'status': 'done', 'message': title, 'body' : body, 'title': title, // 将标题、内容放入data 'tag': uniqueTag // 携带唯一tag }; try{ http.Response response = await http.post(Uri.parse('https://fcm.googleapis.com/fcm/send'), headers: <String, String>{ 'Content-Type': 'application/json', 'Authorization': 'key=MY_CODE' }, body: jsonEncode(<String, dynamic>{ 'priority': 'high', 'data': data, 'to': token }) ); if(response.statusCode != 200){ print("Error"); } }catch(e){ print(e.toString()); }
Flutter端手动展示通知
依赖flutter_local_notifications插件,在消息监听中处理展示:
// 初始化flutter_local_notifications final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); // 监听前台消息 FirebaseMessaging.onMessage.listen((RemoteMessage message) { String title = message.data['title']; String body = message.data['body']; String tag = message.data['tag']; // 手动展示通知,设置唯一id和tag flutterLocalNotificationsPlugin.show( int.parse(tag), // 用tag转成唯一id,避免覆盖 title, body, NotificationDetails( android: AndroidNotificationDetails( 'dbfood', '通知渠道名称', channelDescription: '通知渠道描述', importance: Importance.high, priority: Priority.high, tag: tag, // 绑定tag ), ), ); });
3. 检查Android系统设置
确保应用的通知未被设置为合并通知:
- 打开手机设置 → 应用 → 你的应用 → 通知
- 找到对应通知渠道(dbfood),关闭“合并通知”选项
内容的提问来源于stack exchange,提问作者Nikko Capiroso
相关产品推荐
相关产品推荐

