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

Xamarin跨平台项目获取FCM Token遇阻,求代码放置位置

解决Xamarin.Forms多项目结构下Firebase Token获取位置问题

核心思路

Firebase推送API是平台依赖的,无法直接在.NET Standard 2.0的Forms主项目中调用,必须分Android/iOS平台单独处理,避开应用未初始化的时机,再通过依赖服务或事件回调将Token传递给Forms主项目使用。

Android端处理

  1. 通过Firebase消息服务自动获取Token
    新建继承自FirebaseMessagingService的子类,重写OnNewToken方法——这个方法会在Token首次生成或更新时自动触发,是最可靠的获取时机:

    [Service]
    [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
    public class MyFirebaseMessagingService : FirebaseMessagingService
    {
        public override void OnNewToken(string token)
        {
            base.OnNewToken(token);
            // 将Token传递给Forms项目,示例用全局属性存储
            App.Current.Properties["FcmToken"] = token;
            _ = App.Current.SavePropertiesAsync();
            // 也可通过自定义事件实时通知Forms
            TokenUpdated?.Invoke(this, token);
        }
    
        public static event EventHandler<string> TokenUpdated;
    }
    
  2. 主动获取Token的备选方案
    如果需要主动触发获取(比如用户登录后),不要在MainActivity.OnCreate中调用,而是放在OnPostCreate或Forms初始化完成后,用异步方式执行:

    protected override async void OnPostCreate(Bundle savedInstanceState)
    {
        base.OnPostCreate(savedInstanceState);
        // 确保Firebase初始化完成后再调用
        var token = await FirebaseMessaging.Instance.GetToken();
        if (!string.IsNullOrEmpty(token))
        {
            App.Current.Properties["FcmToken"] = token;
            await App.Current.SavePropertiesAsync();
        }
    }
    

iOS端处理

在AppDelegate中完成APNs注册后,关联Firebase获取FCM Token:

public override void DidRegisterForRemoteNotificationsWithDeviceToken(UIApplication application, NSData deviceToken)
{
   Firebase.Messaging.Messaging.SharedInstance.ApnsToken = deviceToken;
   // 异步获取Token避免阻塞UI线程
   _ = Task.Run(async () =>
   {
       var token = await Firebase.Messaging.Messaging.SharedInstance.GetTokenAsync();
       if (!string.IsNullOrEmpty(token))
       {
           App.Current.Properties["FcmToken"] = token;
           await App.Current.SavePropertiesAsync();
       }
   });
}

Forms主项目接收Token

可通过两种方式获取平台传递的Token:

  • 直接读取App.Current.Properties["FcmToken"](确保平台端已写入)
  • 订阅Android端MyFirebaseMessagingService.TokenUpdated事件,实时接收Token更新

注意事项

  • Android端需在AndroidManifest.xml中正确配置Firebase权限和自定义的MyFirebaseMessagingService
  • iOS端要开启推送权限,在Capabilities中配置Push Notifications和Background Modes(勾选Remote notifications)
  • 必须异步调用GetToken(),避免阻塞主线程引发ANR(Android)或UI卡顿(iOS)

内容的提问来源于stack exchange,提问作者noone392

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:43:24