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

使用Expo(React Native)通过FCM向iOS设备发送推送通知失败求助

问题原因
  1. Token转换参数错误
    Expo的Notifications.getDevicePushTokenAsync()在iOS端返回的是原生APNs token,开发环境下为沙箱token、生产环境下为正式token。调用batchImport接口转换FCM token时如果没有指定对应apns_sandbox参数,生成的FCM token本身无效,首次请求返回InvalidRegistration,FCM收到多次无效请求后会将该token标记为废弃,后续请求就会返回NotRegistered。

  2. 请求体参数不符合规范
    你当前的请求体把content_available同时放在了根节点和data节点,参数冲突不符合APNs要求;且普通可见通知需要单独携带notification节点,静默通知不能携带notification节点,不符合格式的请求就算FCM返回成功,APNs也会直接丢弃通知,不会下发到设备。

  3. 环境不匹配
    Firebase上传的APNs密钥权限、你打包的iOS应用环境(开发/生产)、转换token时指定的环境三者如果不一致,就算所有配置都正确,通知也不会下发到设备。

正确配置与请求格式

前置配置校验

  • 确认Firebase控制台上传的APNs密钥,Bundle ID与你Expo项目app.json中ios.bundleId完全一致,且同时开启了开发、生产环境权限
  • 确认你测试用的iOS应用的打包环境:开发调试包对应沙箱环境,TestFlight/上架包对应生产环境
  • 确认iOS设备已经同意了你应用的推送通知权限

Token转换正确调用方式

调用batchImport接口转换APNs token为FCM token时,必须在请求体中指定对应环境:

  • 沙箱环境添加参数"apns_sandbox": true
  • 生产环境添加参数"apns_sandbox": false

FCM发送请求正确格式

请求头配置

  • Authorization: key=你的Firebase云消息传递服务端密钥
  • Content-Type: application/json

普通可见通知请求体(用户能在通知栏看到)

{
  "to": "对应环境的有效FCM token",
  "priority": "high",
  "notification": {
    "title": "通知标题",
    "body": "通知内容",
    "sound": "default"
  },
  "data": {
    "experienceId": "@你的Expo账号/项目slug",
    "自定义字段": "自定义值"
  }
}

静默通知请求体(仅触发客户端后台逻辑,不展示通知)

{
  "to": "对应环境的有效FCM token",
  "priority": "high",
  "content_available": true,
  "data": {
    "experienceId": "@你的Expo账号/项目slug",
    "自定义字段": "自定义值"
  }
}

注意:不要同时携带根节点notification和content_available参数,两种通知场景分开使用对应格式,避免参数冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:45:05