Firebase控制台可发FCM消息 代码调用报注册令牌无效如何解决
你能用Firebase控制台成功发送测试消息,说明设备令牌本身是合法的,报错是代码侧的配置问题,按以下步骤排查即可:
- 禁止每次调用发送方法都重复创建FirebaseApp实例:你当前的代码每次调用
SendByExample都会新建一个带自定义名称的FirebaseApp实例,重复调用会触发实例已存在异常,就算是首次调用,自定义实例的配置也容易和默认服务账号配置冲突。建议将FirebaseApp的初始化逻辑移到程序启动时全局执行一次,不要嵌套在发送方法内部。 - 核对项目ID配置是否匹配:你代码里硬写的
ProjectId = "posmobxxx"必须和你下载的adminsdk.json文件内的project_id字段值、Firebase控制台的项目ID三者完全一致,只要有一处不匹配,哪怕令牌完全正确也会报无效错误。建议直接去掉代码里硬写的ProjectId,让SDK自动从服务账号json文件读取,能避免绝大多数匹配错误。 - 确认服务账号权限:你使用的
adminsdk.json必须是当前FCM所属项目的服务账号密钥,不要误用其他Firebase项目的服务账号文件,同时确认对应服务账号已被授予云消息发送的相关权限。 - 检查令牌是否携带隐形字符:复制令牌到代码时注意不要多带空格、换行等不可见字符,你可以在给Token属性赋值前打印一次值,和控制台使用的令牌逐字符对比。
修复后代码示例
全局初始化(程序启动时仅执行一次)
// 全局存储FirebaseApp实例,不要重复创建 private static FirebaseApp _fcmApp; public static void InitFcmApp() { string credentialPath = @"C:\IIII\XXXXXy\adminsdk.json"; _fcmApp = FirebaseApp.Create(new AppOptions { // 不硬写ProjectId,SDK自动从服务账号文件读取,避免写错 Credential = GoogleCredential.FromFile(credentialPath) }); }
发送方法
public async static Task<string> SendByExample() { try { var message = new Message { Data = new Dictionary<string, string> { { "additional_data", "a string" }, { "another_data", "another string" } }, Notification = new Notification { Title = "a title", Body = "a body", ImageUrl = "link" }, Token = "eYF7xxaLSbu0Zxxxx0bUO24lr:APxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", }; var fcmInstance = FirebaseMessaging.GetMessaging(_fcmApp); return await fcmInstance.SendAsync(message).ConfigureAwait(false); } catch (Exception ex) { // await会自动解包AggregateException,直接捕获即可拿到真实错误信息 return $"{ex.Message}{Environment.NewLine}{ex.StackTrace}"; } }
内容的提问来源于stack exchange,提问作者Neno
相关产品推荐
相关产品推荐

