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

Firebase通知内容编辑及批量通知优化方案咨询

问题解答

现有方案可行性分析

你的当前方案不可行,因为Firebase RemoteMessage.Notification 中的Body属性是只读的,直接赋值会抛出编译错误。另外,调用base.OnMessageReceived(message)会优先使用原始通知内容展示,即便你能修改Body,也无法覆盖原有逻辑。

正确的单通知内容修改实现

要实现通知内容替换,你需要跳过base.OnMessageReceived的默认处理,自行构建并显示修改后的通知:

public override void OnMessageReceived(RemoteMessage message)
{
    // 跳过base方法,避免默认通知展示
    // base.OnMessageReceived(message);

    // 1. 获取原始通知数据
    var originalNotification = message.GetNotification();
    var originalBody = originalNotification?.Body ?? "";
    var title = originalNotification?.Title ?? "默认标题";

    // 2. 替换内容中的占位符(比如#Name)
    string userName = "张三"; // 从本地存储/用户配置中获取实际名称
    string modifiedBody = originalBody.Replace("#Name", userName);

    // 3. 构建自定义通知
    var notificationBuilder = new NotificationCompat.Builder(this, "CHANNEL_ID")
        .SetSmallIcon(Resource.Drawable.ic_notification)
        .SetContentTitle(title)
        .SetContentText(modifiedBody)
        .SetPriority(NotificationCompat.PriorityHigh)
        .SetAutoCancel(true);

    // 4. 显示通知
    var notificationManager = NotificationManagerCompat.From(this);
    // 用消息ID作为通知ID,避免覆盖;如果没有ID可以用随机数
    int notificationId = message.MessageId != null ? int.Parse(message.MessageId) : new Random().Next();
    notificationManager.Notify(notificationId, notificationBuilder.Build());

    // 处理action逻辑
    if (message.Data.TryGetValue("action", out var messageAction))
        NotificationActionService.TriggerAction(messageAction);
}

批量通知的更优实现方案

当接收大量通知时,建议采用通知合并策略,避免通知栏被大量重复通知占据,同时提升用户体验:

核心思路

  • 使用NotificationCompat.InboxStyle将多条通知合并为一个折叠式通知
  • 维护一个本地通知列表,新通知到来时更新列表并重新构建合并通知
  • 控制合并通知的数量上限,避免内容过长

代码示例

// 全局维护的通知内容列表(可以用SharedPreferences持久化,避免进程重启丢失)
private List<string> _notificationMessages = new List<string>();
private const int MAX_MERGED_NOTIFICATIONS = 5; // 最多显示5条最近的通知
private const int BATCH_NOTIFICATION_ID = 1000; // 批量通知的固定ID

public override void OnMessageReceived(RemoteMessage message)
{
    var originalNotification = message.GetNotification();
    var originalBody = originalNotification?.Body ?? "";
    string userName = "张三";
    string modifiedBody = originalBody.Replace("#Name", userName);

    // 添加到本地列表,保持最新的N条
    _notificationMessages.Insert(0, modifiedBody);
    if (_notificationMessages.Count > MAX_MERGED_NOTIFICATIONS)
    {
        _notificationMessages.RemoveRange(MAX_MERGED_NOTIFICATIONS, _notificationMessages.Count - MAX_MERGED_NOTIFICATIONS);
    }

    // 构建合并通知
    var inboxStyle = new NotificationCompat.InboxStyle()
        .SetBigContentTitle($"收到{_notificationMessages.Count}条新通知")
        .SetSummaryText("点击查看详情");

    foreach (var msg in _notificationMessages)
    {
        inboxStyle.AddLine(msg);
    }

    var notificationBuilder = new NotificationCompat.Builder(this, "CHANNEL_ID")
        .SetSmallIcon(Resource.Drawable.ic_notification)
        .SetContentTitle($"收到{_notificationMessages.Count}条新通知")
        .SetContentText(_notificationMessages[0]) // 显示第一条内容作为预览
        .SetPriority(NotificationCompat.PriorityHigh)
        .SetAutoCancel(true)
        .SetStyle(inboxStyle);

    // 更新批量通知
    var notificationManager = NotificationManagerCompat.From(this);
    notificationManager.Notify(BATCH_NOTIFICATION_ID, notificationBuilder.Build());

    // 处理action逻辑
    if (message.Data.TryGetValue("action", out var messageAction))
        NotificationActionService.TriggerAction(messageAction);
}

额外优化点

  • 持久化通知列表:使用SharedPreferences或本地数据库存储通知内容,避免App进程被杀后丢失合并记录
  • 分组通知:针对不同类型的通知设置不同的Group,实现同类型通知自动合并
  • 后台线程处理:如果通知内容替换涉及复杂逻辑(比如网络请求获取用户名称),要放到后台线程执行,避免阻塞OnMessageReceived(该方法执行超时会被系统终止)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:21:11