You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:50:16