使用FCM Admin发送APN后台更新静默通知时出错
解决FCM Admin发送无badge/sound的静默通知报错问题
我之前在使用FCM Admin发送静默通知时也踩过完全一样的坑!明明苹果开发者指南里的Listing 7-1明确说可以只带content-available: 1,但用FCM发送就报错,加了badge或sound就正常,这其实是FCM转发APNs通知时的规则差异导致的。
问题根源
苹果文档里的示例是直接向APNs发送的payload格式,但FCM作为中间转发层,对静默通知有两个关键要求:
- 必须显式设置APNs的优先级为
5(正常优先级),高优先级(10)要求通知必须包含可见内容(alert/badge/sound),否则APNs会拒绝; - 需要同时配置FCM层面的
content_available: true,确保FCM正确识别这是一条静默通知并转发给APNs。
如果只在aps里加content-available:1,FCM会默认使用高优先级,这就触发了APNs的校验规则,导致通知被拒绝报错;而添加badge/sound后,高优先级符合要求,所以能正常发送。
正确的FCM Payload示例
下面是符合要求的、仅携带data字段的静默通知代码(以Node.js的FCM Admin SDK为例):
const admin = require('firebase-admin'); // 初始化FCM Admin(已初始化可跳过此步骤) admin.initializeApp(); const sendSilentNotification = async (deviceToken) => { const message = { token: deviceToken, // 自定义data字段,供客户端接收后处理 data: { extra1: "your_custom_value_1", extra2: "your_custom_value_2" }, apns: { payload: { aps: { "content-available": 1 // APNs要求的静默标识 } }, headers: { "apns-priority": "5" // 必须设置为正常优先级,静默通知专用 } }, // FCM层面的静默标识,确保FCM正确处理 content_available: true }; try { const response = await admin.messaging().send(message); console.log('静默通知发送成功:', response); } catch (error) { console.error('发送失败:', error); } };
客户端处理提示
客户端收到这条静默通知后,会触发didReceiveRemoteNotification:fetchCompletionHandler(iOS),你可以在这个方法里读取extra1和extra2,然后创建自定义本地通知,完全不需要依赖FCM推送的可见内容。
注意事项
- 不要设置
aps里的alert、badge、sound字段,保持aps仅包含content-available:1; - 确保客户端开启了“后台App刷新”权限,否则静默通知可能无法触发后台处理;
内容的提问来源于stack exchange,提问作者enfix
相关产品推荐
相关产品推荐

