使用Expo(React Native)通过FCM向iOS设备发送推送通知失败求助
问题原因
Token转换参数错误
Expo的Notifications.getDevicePushTokenAsync()在iOS端返回的是原生APNs token,开发环境下为沙箱token、生产环境下为正式token。调用batchImport接口转换FCM token时如果没有指定对应apns_sandbox参数,生成的FCM token本身无效,首次请求返回InvalidRegistration,FCM收到多次无效请求后会将该token标记为废弃,后续请求就会返回NotRegistered。请求体参数不符合规范
你当前的请求体把content_available同时放在了根节点和data节点,参数冲突不符合APNs要求;且普通可见通知需要单独携带notification节点,静默通知不能携带notification节点,不符合格式的请求就算FCM返回成功,APNs也会直接丢弃通知,不会下发到设备。环境不匹配
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
相关产品推荐
相关产品推荐

