.NET Core 8.0升级FCM推送遇无效注册令牌问题排查
问题解答:FCM HTTP v1 提示“无效注册令牌”
1. ExponentPushToken格式是否符合FCM HTTP v1要求?
不符合。ExponentPushToken[xxx]是Expo(原Exponent)专属的推送令牌格式,FCM HTTP v1 API仅接受原生FCM注册令牌——这类令牌是标准的长字符串格式(例如eKabc123xQ:APA91bGhijklmnopQrstuvwxyz...)。旧版FCM可能支持通过Expo的转发机制兼容这类令牌,但v1 API严格要求使用原生FCM令牌。
2. 其他可能导致错误的原因
- 令牌已失效:设备卸载应用、清除应用数据、用户切换Google账号,或应用长时间未与FCM服务器同步,都会导致令牌被标记为无效
- 项目不匹配:该令牌是从另一个Firebase项目生成的,与当前发送请求的项目ID不一致
- 令牌输入错误:令牌存在拼写错误、多余空格,或被截断
- 服务账号权限不足:生成Bearer Token的服务账号未配置
Firebase Cloud Messaging Admin角色,导致FCM服务器无法验证令牌有效性 - 平台配置错误:令牌对应iOS设备,但推送请求使用了Android专属配置,反之亦然
解决建议
- 替换为原生FCM令牌:如果是Expo应用,需通过Expo的FCM集成获取原生令牌。例如使用
expo-firebase-messaging库的getToken()方法,而非Expo的默认推送令牌 - 验证令牌有效性:在Firebase控制台的「Cloud Messaging」模块,使用「发送测试消息」功能输入令牌,快速验证其是否有效
- 检查服务账号权限:登录Google Cloud控制台,找到对应服务账号,为其添加
Firebase Cloud Messaging Admin角色 - 核对项目一致性:确保生成令牌的Firebase项目ID,与请求URL中的
my-project-name-in-googleconsole完全一致 - 优化Bearer Token获取代码:避免同步阻塞调用
.Result,改用异步方式防止死锁:
string fileName = Path.Combine(Directory.GetCurrentDirectory(), "FirebaseServiceAccount\\xyz.json"); string scopes = "https://www.googleapis.com/auth/firebase.messaging"; string bearertoken; using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { var credential = GoogleCredential.FromStream(stream) .CreateScoped(scopes); bearertoken = await credential.UnderlyingCredential.GetAccessTokenForRequestAsync(); }
- 校验Payload格式:确保
notification和data字段符合FCM v1规范,例如notification仅包含title、body、image等官方定义的字段
内容的提问来源于stack exchange,提问作者Xander Kage
相关产品推荐
相关产品推荐

