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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:57:02