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
相关产品推荐
相关产品推荐

