Xamarin跨平台项目获取FCM Token遇阻,求代码放置位置
解决Xamarin.Forms多项目结构下Firebase Token获取位置问题
核心思路
Firebase推送API是平台依赖的,无法直接在.NET Standard 2.0的Forms主项目中调用,必须分Android/iOS平台单独处理,避开应用未初始化的时机,再通过依赖服务或事件回调将Token传递给Forms主项目使用。
Android端处理
通过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; }主动获取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
相关产品推荐
相关产品推荐

