React Native Expo推送通知服务选型及故障求助:Expo Push vs FCM
Expo Push Notifications vs FCM:问题排查与选型建议
一、解决你遇到的两个服务问题
1. Expo Push Notifications(Test Flight收不到通知)
- 确认生产环境APNs证书配置:Test Flight属于苹果生产环境,必须在Expo控制台上传生产版APNs证书,不能用开发证书。证书生成时要绑定正确的Bundle ID,导出为p12格式后完成上传。
- 校验设备令牌环境:Expo在开发、生产模式下生成的令牌不同,Test Flight中的应用获取的是生产令牌,要确保服务器发送推送时使用的是这批生产令牌,而非开发阶段的令牌。
- 检查API调用正确性:生产环境推送请求地址为
https://exp.host/--/api/v2/push/send,请求头需携带Expo-Project-Id: 你的项目ID,payload的to字段对应生产令牌,同时确保sound、body等字段符合Expo推送规范。
2. Firebase Cloud Messaging(模拟器收不到通知)
- 模拟器限制:iOS模拟器不支持FCM推送,必须使用真实iOS设备测试;Android模拟器需选择带Google APIs的系统镜像,且确保Google Play服务已正常安装并更新。
- 验证令牌有效性:检查获取的FCM令牌是否为当前设备的有效令牌,应用卸载重装、系统版本更新、设备重置等操作都会导致令牌失效,需重新获取。
- 核对请求格式与密钥:用Node服务器调用FCM API时,请求头需设置
Authorization: key=你的服务器密钥,payload结构需符合平台要求:- Android:需包含
notification(前台通知)或data(后台数据)字段; - iOS:需将
aps字段嵌套在notification中,示例结构:{ "to": "设备令牌", "notification": { "title": "测试通知", "body": "这是一条FCM测试通知", "aps": { "alert": { "title": "测试通知", "body": "这是一条FCM测试通知" } } } }
- Android:需包含
二、选型建议
- 纯Expo项目(未eject):优先选Expo Push Notifications,它封装了APNs和FCM的底层逻辑,无需分别配置两个平台的推送服务,批量推送只需调用Expo统一的推送API,传入令牌数组即可,减少跨平台配置成本。
- 已eject/原生混合项目:选FCM更合适,FCM支持更灵活的原生端定制,比如自定义通知样式、后台数据处理,批量推送可通过主题订阅、令牌列表批量发送实现,原生端配置可控性更强。
内容的提问来源于stack exchange,提问作者Mickey
相关产品推荐
相关产品推荐

