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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:43:31