Swift中FCM通知缺失Badge变量,无法显示应用图标角标
解决FCM通知缺失badge字段导致角标无法显示的问题
我来帮你搞定这个角标计数的问题!从你提供的通知payload能明显看到,aps字典里压根没包含badge字段——这就是你强制解包content.badge时崩溃的核心原因:当payload里没有这个值时,content.badge是nil,用as! Int强制解包必然会触发错误。
我们可以从服务端payload配置和客户端容错处理两个层面解决问题:
方案一:在FCM发送的payload中添加badge字段
如果你能修改发送FCM通知的服务端代码,直接在aps字典里补上badge字段就好,示例payload如下:
{ "aps": { "alert": { "body": "You have new message! Check in the app.", "title": "Tutil" }, "sound": "default", "badge": 1 // 可以设置为当前角标+1,或者由服务端统一维护计数 }, // 其他自定义字段... }
这样客户端收到通知时,content.badge就会有有效值,你可以正常获取使用。
方案二:客户端本地维护角标计数(适合无法修改服务端的场景)
要是没法改动服务端的payload,那我们就在客户端自己维护角标数,每次收到通知自动累加,同时处理badge字段为nil的情况。修改你的willPresent方法如下:
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { let userInfo = notification.request.content.userInfo print("%@", userInfo) let content = notification.request.content // 安全处理badge字段,彻底避免强制解包崩溃 let badgeCount: Int if let badge = content.badge as? Int { badgeCount = badge } else { // 若payload无badge字段,就取当前应用角标数再加1 let currentBadge = UIApplication.shared.applicationIconBadgeNumber badgeCount = currentBadge + 1 } incrementBadgeNumberBy(badgeNumberIncrement: badgeCount) // 同步更新应用图标角标 UIApplication.shared.applicationIconBadgeNumber = badgeCount completionHandler([.alert,.badge,.sound]) }
额外提示:
- 如果你希望用户点击通知后角标自动清零,记得在
didReceiveResponse方法里加上UIApplication.shared.applicationIconBadgeNumber = 0。 - 本地维护角标时,要注意应用被杀死重启的情况——可以把当前角标数存在
UserDefaults里,启动App时读取并设置给applicationIconBadgeNumber,防止计数丢失。
内容的提问来源于stack exchange,提问作者Viva
相关产品推荐
相关产品推荐

