You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:07:40