如何在API 33的Xamarin.Android中正确注册FCM并获取令牌
我来帮你梳理API 33下FCM令牌获取失败的解决思路,结合你遇到的AUTHENTICATION_FAILED报错和场景,这些方向应该能帮到你:
解决API 33下FCM令牌获取失败的具体方案
1. 修正权限申请与Firebase初始化的时机
你当前的代码在发起权限请求后立刻初始化Firebase,但RequestPermissions是异步操作,此时权限还未真正完成授权,会导致Firebase初始化时权限上下文异常。正确的做法是在权限申请的回调中处理后续逻辑:
在你的Activity中重写权限回调方法:
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { base.OnRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 0) { // 确认POST_NOTIFICATIONS权限已授予 if (grantResults.Length > 0 && grantResults[0] == Android.Content.PM.Permission.Granted) { // 权限生效后再初始化Firebase并获取令牌 FirebaseApp.InitializeApp(CrossCurrentActivity.Current.AppContext); _ = FetchFcmTokenAsync(); } } } private async Task FetchFcmTokenAsync() { try { var token = await FirebaseMessaging.Instance.GetToken(); Console.WriteLine($"获取到FCM令牌: {token}"); } catch (Exception ex) { Console.WriteLine($"令牌获取失败: {ex.Message}"); } }
2. 检查Firebase配置与签名指纹
AUTHENTICATION_FAILED最常见的原因是签名指纹不匹配:
- 打开Firebase控制台,进入项目设置 > 应用,确认你当前使用的调试/发布签名的SHA-1、SHA-256指纹已正确添加。API 33对签名验证的要求更严格,哪怕调试签名也不能遗漏。
- 重新下载
google-services.json文件替换项目中的旧文件,确保文件内的client配置和控制台一致。
3. 升级Xamarin相关包版本
你使用的包版本相对老旧,可能存在API 33适配问题:
- 建议将
Xamarin.Firebase.Messaging升级到最新稳定版(如123.0.1),同时确保Xamarin.GooglePlayServices.Base等依赖包版本与之匹配(Xamarin Firebase包通常需要同大版本的Google Play服务依赖)。 - 考虑升级
Xamarin.Forms到5.x及以上稳定版,新版本对Android 13(API 33)的兼容性更好。
4. 修复模拟器Google Play服务问题
带Google Play的API 33模拟器可能存在服务版本过低的情况:
- 打开模拟器内的Google Play应用,进入设置 > 关于,检查Google Play服务版本,若不是最新则点击更新。
- 如果更新失败,尝试下载最新的API 33模拟器镜像(选择带Google Play的x86_64或arm64版本)重新创建模拟器。
5. 确认Cloud Messaging API状态
在Firebase控制台项目设置 > 云消息传递中,确保**Cloud Messaging API (Legacy)**已启用。部分旧版本FCM SDK依赖该接口,禁用会导致认证失败。
6. 检查FirebaseMessagingService注册
确保你已正确注册自定义消息服务:
在AndroidManifest.xml中添加服务声明:
<service android:name=".MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
同时实现服务类并重写OnNewToken:
[Service] [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })] public class MyFirebaseMessagingService : FirebaseMessagingService { public override void OnNewToken(string token) { base.OnNewToken(token); Console.WriteLine("收到新FCM令牌: " + token); } }
内容的提问来源于stack exchange,提问作者Dorian Olarescu
相关产品推荐
相关产品推荐

