MAUI Blazor中如何通过FCM实现推送通知时应用图标角标计数增加
实现MAUI Blazor应用图标通知角标(基于Plugin.Firebase 1.3.0 + FCM)
FCM本身不直接控制应用角标,需结合各平台原生能力,配合Plugin.Firebase的消息处理实现计数更新,具体步骤如下:
1. 配置FCM推送Payload
发送FCM消息时,在payload中携带角标相关字段,分平台处理:
- iOS:在
aps字段中直接指定badge数值(支持具体数字或增量逻辑){ "notification": { "title": "新消息", "body": "您有一条新通知" }, "data": { "badge": "1" }, "aps": { "badge": 1 } } - Android:在
data字段中携带计数信息,由应用端自行处理(FCM无原生角标支持)
2. 在MAUI Blazor中处理消息并更新角标
2.1 初始化FCM并注册消息接收器
在MauiProgram.cs中完成Plugin.Firebase的初始化与消息监听:
builder.Services.AddFirebaseMessaging(options => { options.MessageReceived += async (sender, message) => { await HandleReceivedMessageAsync(message); }; });
2.2 实现消息处理逻辑
创建方法提取角标计数,分平台调用原生API更新:
private async Task HandleReceivedMessageAsync(IFirebaseMessage message) { // 从消息中提取角标计数 var badgeCount = 0; if (message.Data.TryGetValue("badge", out var badgeStr) && int.TryParse(badgeStr, out var count)) { badgeCount = count; } // 按平台更新角标 #if IOS await UpdateiOSBadgeAsync(badgeCount); #elif ANDROID await UpdateAndroidBadgeAsync(badgeCount); #endif }
2.3 各平台原生角标实现
iOS平台
直接调用iOS原生API设置角标:
private async Task UpdateiOSBadgeAsync(int count) { await MainThread.InvokeOnMainThreadAsync(() => { UIKit.UIApplication.SharedApplication.ApplicationIconBadgeNumber = count; }); }
注意:需在
Info.plist中申请通知权限时包含UNAuthorizationOption.Badge
Android平台
Android无统一角标规范,需适配主流厂商(小米、华为、三星等):
private async Task UpdateAndroidBadgeAsync(int count) { await MainThread.InvokeOnMainThreadAsync(() => { var context = Android.App.Application.Context; // 适配小米 try { var miuiManager = Java.Lang.Class.ForName("android.app.MiuiNotificationManager") .GetMethod("getInstance", Java.Lang.Class.FromType(typeof(Android.Content.Context))) .Invoke(null, new object[] { context }); miuiManager.GetMethod("setNotificationBadgeCount", Java.Lang.Class.FromType(typeof(Android.App.Service)), Java.Lang.Class.FromType(typeof(int))) .Invoke(miuiManager, new object[] { context, count }); } catch (Exception) { // 适配华为 try { var huaweiManager = context.GetSystemService("notification"); huaweiManager.Class.GetMethod("setBadgeNumber", Java.Lang.Class.FromType(typeof(int))) .Invoke(huaweiManager, new object[] { count }); } catch (Exception) { // 适配三星 try { var intent = new Android.Content.Intent("android.intent.action.BADGE_COUNT_UPDATE"); intent.PutExtra("badge_count", count); intent.PutExtra("badge_count_package_name", context.PackageName); intent.PutExtra("badge_count_class_name", context.PackageManager.GetLaunchIntentForPackage(context.PackageName).Component.ClassName); context.SendBroadcast(intent); } catch { /* 其他厂商可补充适配 */ } } } }); }
3. 维护角标计数一致性
- 应用启动/从后台恢复时,调用清零或同步逻辑(可通过
Preferences存储当前计数) - 用户点击通知进入应用时,将角标清零
注意事项
- 确保各平台Firebase配置文件(
GoogleService-Info.plist、google-services.json)已正确放置 - Android部分厂商适配需添加对应权限,如华为需在Manifest中添加:
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE" />
内容的提问来源于stack exchange,提问作者Edmatix Mazik
相关产品推荐
相关产品推荐

