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

Firebase Cloud Messaging iOS端是否支持contentAvailable字段及角标问题咨询

iOS FCM 后台推送问题解决方案

1. FCM 中实现后台数据接收(对应 contentAvailable 功能)

FCM 里和原生 API contentAvailable: true 等效的字段是content_available(下划线分隔,非驼峰格式),只要在推送 payload 里将这个字段设为true,就能触发 iOS 设备的后台数据接收逻辑,效果和原生配置完全一致。

  • HTTP v1 API 配置示例:
    在请求的apns payload 中按如下结构编写:

    {
      "message": {
        "token": "你的设备Token",
        "apns": {
          "payload": {
            "aps": {
              "content_available": true
            }
          },
          "headers": {
            "apns-priority": "5"
          }
        },
        "data": {
          "自定义键": "自定义值"
        }
      }
    }
    

    必须设置apns-priority为5,这是后台静默推送的硬性要求,否则容易被系统拦截。

  • Firebase Admin SDK(Node.js 示例):

    const message = {
      token: '你的设备Token',
      apns: {
        payload: {
          aps: {
            content_available: true
          }
        },
        headers: {
          'apns-priority': '5'
        }
      },
      data: {
        customKey: 'customValue'
      }
    };
    
    admin.messaging().send(message);
    

另外需要注意,iOS 项目必须开启Background Modes中的Remote notifications权限,否则后台无法触发数据接收回调。

2. 后台接收 FCM 消息时实现角标递增

实现角标递增有两种可靠方案:

方案一:服务端计算后推送

最稳定的方式是由服务端维护每个用户的未读消息数,推送时直接将计算好的数值填入aps的badge字段:

{
  "message": {
    "token": "你的设备Token",
    "apns": {
      "payload": {
        "aps": {
          "content_available": true,
          "badge": 3 // 服务端算出的未读总数
        }
      }
    }
  }
}

方案二:客户端本地维护递增

如果需要在客户端处理,可在后台接收消息的回调中更新角标:

  • 在AppDelegate的application(_:didReceiveRemoteNotification:fetchCompletionHandler:)方法中添加逻辑:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    // 获取当前角标数
    let currentBadge = UIApplication.shared.applicationIconBadgeNumber
    // 角标加1
    let newBadge = currentBadge + 1
    UIApplication.shared.applicationIconBadgeNumber = newBadge
    
    // 处理完成后必须调用该方法
    completionHandler(.newData)
}
  • iOS 10+ 也可通过UNUserNotificationCenterDelegate的回调处理:
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    let currentBadge = UIApplication.shared.applicationIconBadgeNumber
    UIApplication.shared.applicationIconBadgeNumber = currentBadge + 1
    completionHandler()
}

注意:若应用被用户强制杀死,后台回调不会触发,这种情况下只能依赖服务端推送指定的 badge 数值。

内容的提问来源于stack exchange,提问作者Thinh Vo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 04:30:41