Firebase云函数推送安卓正常iOS无法接收 该如何排查修复?
iOS Firebase推送无法接收问题修复方案
核心问题排查
你已经确认控制台可以正常发送iOS推送,说明基础的APNs证书/密钥、Firebase配置、iOS端权限申请都是正常的,问题大概率出在云函数的推送 payload 配置上:
- 问题1:使用了iOS 关键通知(critical notification)参数,该权限需要单独向苹果申请,未申请的应用携带该参数会直接被APNs拒收推送
- 问题2:缺少iOS13+强制要求的
apns-push-type请求头,缺失该头的推送会被APNs直接丢弃 - 问题3:未打印推送请求的详细返回结果,无法定位具体失败原因
- 问题4:如果是前台场景收不到通知,属于iOS系统默认行为,需要额外处理
修复步骤
1. 修改APNs配置
将你云函数中两处apns配置替换为以下内容,移除关键通知参数,补充必填请求头:
apns: { headers: { "apns-priority": "10", "apns-push-type": "alert" // 新增iOS13+必填的推送类型头 }, payload: { aps: { alert: { title: "你的通知标题", body: "你的通知内容", }, sound: "default" // 替换原来的critical声音对象,使用普通默认声音 }, }, },
2. 完善错误日志打印
将两处PromiseAllSettled的处理逻辑修改为以下内容,打印每个推送请求的详细结果,方便定位问题:
return await PromiseAllSettled(promiseList) .then((results) => { results.forEach((result, index) => { const targetToken = tokenList[index]; if (result.status === 'fulfilled') { console.log(`推送成功,token:${targetToken},返回结果:`, result.value); } else { console.error(`推送失败,token:${targetToken},错误信息:`, result.reason); } }); console.log(`所有推送请求处理完成`); return true; }) .catch((e) => { console.error(`推送流程全局失败`, { 错误详情: e }); return false; });
3. 验证场景
- 测试时先将iOS应用退到后台,iOS默认不会在前台展示推送通知,需要在Flutter端监听
FirebaseMessaging.onMessage事件,调用本地通知插件主动弹出前台通知 - 若日志中出现
InvalidApnsToken错误,检查存储的token是否和当前云函数的运行环境(沙箱/生产)匹配,debug包和release包获取的token不通用
额外验证点
如果修改后仍有问题,可以优先检查:
- 你使用的Firebase Admin SDK版本是否大于9.0.0,旧版本可能存在APNs参数适配问题
- 云函数使用的服务账号是否拥有
cloudmessaging.messages.create权限 - iOS端是否正确注册了APNs token并上传到Firestore,没有出现token为空或者存储错误的情况
内容的提问来源于stack exchange,提问作者mrKoring01
相关产品推荐
相关产品推荐

