Firebase Cloud Messaging iOS端是否支持contentAvailable字段及角标问题咨询
iOS FCM 后台推送问题解决方案
1. FCM 中实现后台数据接收(对应 contentAvailable 功能)
FCM 里和原生 API contentAvailable: true 等效的字段是content_available(下划线分隔,非驼峰格式),只要在推送 payload 里将这个字段设为true,就能触发 iOS 设备的后台数据接收逻辑,效果和原生配置完全一致。
HTTP v1 API 配置示例:
在请求的apnspayload 中按如下结构编写:{ "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
相关产品推荐
相关产品推荐

