Xamarin实现带标签设备注册到Azure通知中心的时机控制问题
解决方案
一、OnNewToken触发时机说明
- 应用首次安装启动,FCM首次为当前设备生成唯一Token时
- FCM后台触发Token安全轮换时
- 应用被清除数据、重新安装、系统大版本升级导致原有Token失效时
二、主动获取FCM Token实现自定义时机注册
你完全可以主动获取当前有效的FCM Token,等待用户完成登录、提交自定义标签后再执行Azure通知中心注册操作,实现方案如下:
步骤1:修改原有OnNewToken逻辑,仅存储Token不注册
把原来的注册逻辑从OnNewToken中移除,仅做Token本地持久化:
public override void OnNewToken(string token) { base.OnNewToken(token); System.Diagnostics.Debug.WriteLine(token); // 将Token存入本地SharedPreferences,供后续注册时读取 var sharedPref = Application.Context.GetSharedPreferences("AppConfig", FileCreationMode.Private); sharedPref.Edit().PutString("CurrentFcmToken", token).Commit(); }
步骤2:封装公共注册方法,支持传入自定义标签
封装可主动调用的注册方法,支持本地无Token时主动向FCM请求最新Token:
using Firebase.Messaging; using Microsoft.Azure.NotificationHubs; using Xamarin.Forms; public static class NotificationRegisterHelper { public static async Task RegisterWithCustomTagsAsync(string[] customTags) { // 读取本地存储的Token var sharedPref = Application.Context.GetSharedPreferences("AppConfig", FileCreationMode.Private); var fcmToken = sharedPref.GetString("CurrentFcmToken", string.Empty); // 本地无Token时主动请求 if (string.IsNullOrEmpty(fcmToken)) { var tokenResult = await FirebaseMessaging.Instance.GetToken(); fcmToken = tokenResult.ToString(); // 存到本地避免重复请求 sharedPref.Edit().PutString("CurrentFcmToken", fcmToken).Commit(); } // 执行Azure通知中心注册逻辑 var hub = new NotificationHub( Constants.HubName, Constants.HubConnectionString, MainActivity.Context); // 携带自定义标签注册 var registration = hub.Register(fcmToken, customTags); // 注册模板(保留原有逻辑) var pnsHandle = registration.PNSHandle; var templateReg = hub.RegisterTemplate( pnsHandle, "defaultTemplate", FirebaseMessagingServiceEx.Template, customTags); var receiver = DependencyService.Get<INotificationsReceiver>(); receiver?.RaiseNotificationReceived("Ready and registered with custom tags..."); } }
步骤3:在合适的时机触发注册
在用户完成登录、或者用户提交自定义标签的逻辑后,调用上面的方法即可:
// 示例:用户登录成功后调用 var customTags = new string[] { "userId:12345", userInputTag, Constants.HubTagName }; await NotificationRegisterHelper.RegisterWithCustomTagsAsync(customTags);
三、注意事项
- Token更新后需要重新注册:如果后续OnNewToken触发了Token更新,建议同步调用一次注册方法,将新Token更新到Azure通知中心,避免推送丢失
- 确保调用注册方法时MainActivity.Context已完成初始化,不要在应用启动的早期生命周期(如Application.OnCreate)中调用
- Azure通知中心的单标签长度不能超过120字符,不能包含
@、#、:之外的特殊字符
内容的提问来源于stack exchange,提问作者Nuno Soares
相关产品推荐
相关产品推荐

