Flutter集成FCM后iOS端通过后台消息更新应用角标失败求助
问题排查与解决方案
1. 确认iOS端角标权限已开启
- 首先检查Xcode项目的Signing & Capabilities标签,确保已添加
Push Notifications和Background Modes能力,且Background Modes下勾选了Remote notifications选项 - 应用启动时必须主动申请角标权限,仅申请通知弹窗/声音权限不会默认开启角标权限,参考代码:
AwesomeNotifications().isNotificationAllowed().then((isAllowed) { if (!isAllowed) { AwesomeNotifications().requestPermissionToSendNotifications( channelKey: 'basic_channel', permissions: [ NotificationPermission.Alert, NotificationPermission.Sound, NotificationPermission.Badge, // 必须单独声明申请角标权限 ] ); } });
- 也可手动打开系统设置→对应App→通知,确认应用图标标记开关处于开启状态
2. 修正角标计数逻辑
你当前调用的FlutterAppBadger.updateBadgeCount(1)是直接把角标设置为固定值1,而非累加计数,需要先读取当前角标数值再做+1操作,同时确认flutter_app_badger依赖为最新版本,兼容项目设置的iOS最低部署版本(建议≥12.0):
Future<void> backgroundNotificationHandler(RemoteMessage message) async { int currentCount = await FlutterAppBadger.getBadgeCount() ?? 0; await FlutterAppBadger.updateBadgeCount(currentCount + 1); debugPrint("Received notification: " + message.data.toString()); return Future.value(); }
另外确认backgroundNotificationHandler是顶层函数,不能定义在类内部,否则不符合FirebaseMessaging.onBackgroundMessage的参数要求。
3. 调整FCM推送逻辑避免冲突
你当前同时发送了两条推送(静默推送payloadBackground和普通通知推送payload),iOS系统收到带notification字段的推送时,如果payload中携带badge参数会直接覆盖本地设置的角标值:
- 可选方案1:直接在服务端普通payload的
notification字段中添加badge: 对应计数值,由APNs直接更新角标,不需要本地处理 - 可选方案2:移除普通payload的
notification字段,所有通知统一走本地代码触发展示,避免系统默认通知行为覆盖角标设置
4. 检查AwesomeNotifications配置
如果使用AwesomeNotifications展示本地通知,可直接用其自带的角标能力替代FlutterAppBadger,避免库兼容性问题:
// 累加角标计数 int currentCount = await AwesomeNotifications().getGlobalBadgeCounter(); await AwesomeNotifications().setGlobalBadgeCounter(currentCount + 1);
5. 本地调试验证
用Xcode连接真机运行应用,杀死应用后发送测试推送,查看Xcode控制台日志输出,确认backgroundNotificationHandler是否被正常触发,如果回调未执行,检查静默推送的content_available: true和priority: high配置是否正确。
内容的提问来源于stack exchange,提问作者Jesse Geens
相关产品推荐
相关产品推荐

