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

MAUI中使用Azure Notification Hub推送通知遇RegistrationId格式错误求助

MAUI集成Azure Notification Hub推送通知解决方案

一、解决RegistrationId格式错误异常

问题原因

你手动指定了RegistrationId = Guid.NewGuid().ToString(),但Azure Notification Hub的RegistrationId由服务端自动生成,自定义的Guid格式不符合服务端要求,导致BadRequestException。

修复代码

修改RegisterWithNotificationHubs方法,移除手动设置RegistrationId的代码:

private async void RegisterWithNotificationHubs(string deviceTokenString)
{
    try
    {
        var services = new ServiceCollection();

        // 注册NotificationHubClient
        services.AddSingleton<NotificationHubClient>(provider =>
        {
            var connectionString = ConfigPush.ListenConnectionString;
            var hubName = ConfigPush.NotificationHubName;

            return NotificationHubClient.CreateClientFromConnectionString(connectionString, hubName);
        });

        var serviceProvider = services.BuildServiceProvider();
        var notificationHubClient = serviceProvider.GetRequiredService<NotificationHubClient>();

        // 不再手动设置RegistrationId,由服务端自动生成
        var registration = new AppleRegistrationDescription(deviceTokenString)
        {
            Tags = new HashSet<string> { "default" } // 设置标签
        };

        // 注册设备到通知中心
        var registrationDescription = await notificationHubClient.CreateOrUpdateRegistrationAsync(registration);
        Console.WriteLine($"Registration ID: {registrationDescription.RegistrationId}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"注册失败: {ex.Message}");
    }
}

二、MAUI集成Azure Notification Hub推送通知步骤

1. 基础配置

  • 安装NuGet包:Microsoft.Azure.NotificationHubs
  • 在Azure门户创建Notification Hub,获取监听连接字符串和通知中心名称,配置到项目的全局配置类(如ConfigPush)中

2. iOS端配置

(1) 权限申请与设备Token获取

在Platforms/iOS/AppDelegate.cs中实现通知权限申请和设备Token回调(你的现有代码这部分逻辑正确,可直接保留):

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
    try
    {
        // 请求通知权限
        UNUserNotificationCenter.Current.RequestAuthorization(
            UNAuthorizationOptions.Alert | UNAuthorizationOptions.Sound | UNAuthorizationOptions.Badge,
            (granted, error) =>
            {
                if (granted)
                {
                    InvokeOnMainThread(() => UIApplication.SharedApplication.RegisterForRemoteNotifications());
                }
            });

        return base.FinishedLaunching(application, launchOptions);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"初始化失败: {ex.Message}");
        return true;
    }
}

[Export("application:didRegisterForRemoteNotificationsWithDeviceToken:")]
public void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
{
    // 转换设备Token为字符串
    var deviceTokenString = BitConverter.ToString(deviceToken.ToArray()).Replace("-", "").ToLower();
    // 注册到Notification Hub
    RegisterWithNotificationHubs(deviceTokenString);
}

(2) 项目配置

  • 在Platforms/iOS/Info.plist中添加推送通知权限描述:
<key>NSNotificationSettingsUsageDescription</key>
<string>需要推送通知来接收重要消息</string>
<key>NSRemoteNotificationUsageDescription</key>
<string>需要推送通知来接收重要消息</string>
  • 在Azure门户的Notification Hub中配置APNs证书或密钥

3. Android端配置

(1) 设备Token获取与注册

在Platforms/Android/MainApplication.cs中实现FCM Token获取:

using Firebase.Messaging;
using Android.App;

namespace YourAppName.Platforms.Android;

[Application]
public class MainApplication : MauiApplication
{
    public MainApplication(IntPtr handle, JniHandleOwnership ownership) : base(handle, ownership)
    {
    }

    protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();

    public override void OnCreate()
    {
        base.OnCreate();
        FirebaseMessaging.Instance.GetToken().AddOnCompleteListener(task =>
        {
            if (!task.IsSuccessful)
            {
                Console.WriteLine($"获取FCM Token失败: {task.Exception}");
                return;
            }
            var token = task.Result;
            // 注册到Notification Hub
            RegisterWithNotificationHubs(token);
        });
    }
}

(2) 项目配置

  • 安装NuGet包:Xamarin.Firebase.Messaging
  • 在Azure门户的Notification Hub中配置FCM服务器密钥
  • 在Platforms/Android/AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

4. 通用注册逻辑封装

将注册逻辑抽取到共享项目中,避免重复代码:

public static async Task RegisterWithNotificationHubs(string deviceToken)
{
    var connectionString = ConfigPush.ListenConnectionString;
    var hubName = ConfigPush.NotificationHubName;
    var client = NotificationHubClient.CreateClientFromConnectionString(connectionString, hubName);

    // 根据平台创建对应的RegistrationDescription
    RegistrationDescription registration;
#if IOS
    registration = new AppleRegistrationDescription(deviceToken);
#elif ANDROID
    registration = new GcmRegistrationDescription(deviceToken);
#endif
    registration.Tags = new HashSet<string> { "default" };

    await client.CreateOrUpdateRegistrationAsync(registration);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:23:10