Expo双App间FCM Server Key报错排查请求
问题排查与解决方案
核心问题定位
报错提示无法获取接收方App的FCM服务器密钥,且标记为InvalidCredentials,说明App A的FCM凭证在Expo或Supabase侧未正确配置/关联,导致B发起推送请求时,Supabase Edge Functions调用Expo服务无法验证App A的权限。
具体排查步骤
1. 验证App A的Expo凭证配置
- 确认Expo控制台中App A的Google服务账号密钥是对应Firebase项目的正确密钥:
- 检查Firebase项目是否与App A绑定,密钥是否是该项目的
service-account.json文件(而非App B的) - 确保上传密钥时,Expo控制台的项目选择正确,没有误上传到App B的配置里
- 检查Firebase项目是否与App A绑定,密钥是否是该项目的
- 检查Expo项目的
app.json/app.config.js中,android.googleServicesFile(Android)或ios.googleServicesFile(iOS)是否正确指向本地的服务账号文件,且该文件内容与Expo控制台上传的一致
2. 检查Supabase Edge Functions中的凭证关联
- 确认Edge Functions中处理推送的代码,是否正确区分了两个App的Expo项目ID:
- 发送通知时,是否根据接收方的App标识(比如用户数据中存储的App类型/项目ID),正确调用对应Expo项目的推送服务
- 检查是否存在硬编码的Expo项目ID,导致B发送时错误使用了自己的项目ID去获取A的FCM密钥
- 验证Supabase存储的用户推送令牌是否与对应App关联:确保App A用户的令牌被标记为属于A的项目,App B用户的令牌属于B的项目,避免推送时混淆了接收方的App归属
3. 验证Expo Push API的权限
- 手动调用Expo Push API测试App A的凭证有效性:
使用curl发送测试请求(替换EXPO_TOKEN_A为App A的有效推送令牌,EXPO_PROJECT_ID_A为A的项目ID):
如果返回同样的curl -H "Content-Type: application/json" -X POST "https://exp.host/--/api/v2/push/send" -d '{ "to": "EXPO_TOKEN_A", "title": "Test", "body": "Test notification from API" }'InvalidCredentials错误,说明问题出在Expo侧的凭证配置,需重新上传App A的服务账号密钥并等待Expo同步(可能需要10-15分钟)
4. 检查Firebase项目的权限配置
- 确认Firebase项目中,服务账号是否拥有
Cloud Messaging Admin权限:
登录Firebase控制台,进入项目设置 > 服务账号,找到对应的服务账号,检查其角色是否包含Firebase Cloud Messaging Admin - 确保Firebase项目的云消息服务未被禁用,且API密钥未过期或被限制
常见遗漏点
- 上传Expo凭证后未重新构建/发布App:修改Expo凭证后,需要重新生成构建包(
eas build)或发布更新(expo publish),否则App侧的配置不会同步 - 两个App共享了同一个Firebase项目:如果两个App使用同一Firebase项目,需确保Expo控制台中两个项目都上传了该项目的服务账号密钥,且Firebase侧允许该项目向两个App发送消息
内容的提问来源于stack exchange,提问作者Koreahn
相关产品推荐
相关产品推荐

