Flutter中FCM推送通知无法显示图标角标如何解决
问题产生原因
- 平台配置缺失:现有代码仅添加了iOS(APNs)侧的角标参数,完全没有配置Android平台的角标规则,Android设备无法识别角标展示指令。
- Payload优先级冲突:当请求顶层存在
notification字段时,FCM服务会自动生成默认的aps节点,手动写在apns.payload.aps下的badge参数会被默认值覆盖,iOS端无法读取到正确的角标数值。 - 端侧权限未适配:iOS 10+、Android 13+都需要单独申请通知角标权限,国内定制安卓系统还需要额外开通厂商推送的角标权限,权限缺失时参数正确也无法展示角标。
修复方案
- 修正推送请求Payload结构,补全双平台角标配置,参考代码如下:
final data = { "notification": { "title": title, "body": body, "badge": "1" // 兼容FCM旧版接口的iOS角标字段,避免被默认值覆盖 }, // iOS APNs 专属配置 "apns": { "payload": { "aps": { "badge": 1, "sound": "default" } } }, // Android 平台专属配置 "android": { "notification": { "notification_count": 1, // 角标展示的未读数值 "default_sound": true } }, "to": pid };
如果你使用的是FCM HTTP v1版本接口,需要把上述所有字段包裹在
message节点下,同时将to字段替换为token字段,否则请求会直接被FCM服务拒绝。
- 完成端侧权限适配
- iOS端:启动时调用
FirebaseMessaging.instance.requestPermission(badge: true)申请通知权限,确保badge参数传入true;在Info.plist中配置UIBackgroundModes包含remote-notification,保证后台状态下也能更新角标。 - Android端:
- Android 13及以上版本提前申请
POST_NOTIFICATIONS运行时通知权限 - 针对小米、华为、OPPO、vivo等国内定制ROM机型,需要在对应厂商的推送运营后台开通角标展示能力,同时在App Manifest中添加厂商要求的角标专属权限。
- Android 13及以上版本提前申请
- 完善角标逻辑
- 不要固定传角标值为1,需要根据用户实际未读消息数动态传入对应数值
- 用户点击进入App、读完所有未读消息时,可借助
flutter_app_badger插件调用FlutterAppBadger.updateBadgeCount(0)主动清零角标,避免角标数字和实际未读数不符。
内容的提问来源于stack exchange,提问作者eternal dating
相关产品推荐
相关产品推荐

