使用FCM向iOS发送静默推送通知失败求助
我帮你梳理下可能的原因和调整方案,结合你用NWPusher能成功的情况,重点聚焦Firebase Admin的消息结构和APNs参数配置差异:
1. 对齐APNs原生Payload格式
你用NWPusher的有效载荷里,明确在aps字段中包含了content-available:1和badge:0,但firebase-admin的顶层options参数可能没有正确映射到APNs的aps结构。建议直接指定APNs的payload内容,和NWPusher的格式保持一致:
var options = { priority: 'high', timeToLive: 60 * 60 * 24, apns: { payload: { aps: { 'content-available': 1, badge: 0 // 新增这个字段,和NWPusher的配置对齐,避免部分设备兼容性问题 } } } };
保持原有message结构不变(仅包含data字段、无notification字段),这样Firebase会自动把data字段附加到APNs payload中,同时生成符合要求的aps部分。
2. 适配iOS 13+的推送类型要求
iOS 13及以上版本要求静默通知必须指定apns-push-type为background,这是很容易忽略的细节。可以在apns配置的headers里补充该参数:
apns: { headers: { 'apns-push-type': 'background', 'apns-environment': 'development' // 根据你的测试环境选择,生产环境填'production' }, payload: { aps: { 'content-available': 1, badge: 0 } } }
3. 排查firebase-admin版本的参数差异
在7.0.0版本的firebase-admin中,顶层的contentAvailable参数可能存在映射不生效的情况。建议移除原本顶层的contentAvailable和mutableContent,改用apns.payload.aps内的配置,更贴近APNs原生规则。
4. 查看Firebase返回的详细响应
你打印的res对象里包含了每个设备的发送状态,建议格式化输出看看是否有具体错误:
console.log(JSON.stringify(res, null, 2));
如果results数组里出现error字段,可以根据错误码(比如InvalidApnsToken、Unregistered等)进一步排查,不过你用NWPusher能成功,token大概率没问题,但确认下更稳妥。
5. 对比Firebase与NWPusher的Payload差异
如果以上方法都没解决,可以尝试抓包查看Firebase发送到APNs的实际payload,和NWPusher的payload做对比,看看是否存在结构差异(比如字段大小写、嵌套层级错误等)。
内容的提问来源于stack exchange,提问作者John Doherty

