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

Xamarin Forms中Firebase后台推送通知修改后重复显示问题求助

解决Xamarin.Forms中Firebase推送通知后台重复显示问题

问题描述

我是Xamarin Forms新手,尝试在显示通知前修改其内容,目前仅使用data payload。当应用处于后台状态时,会同时显示修改后的通知内容和原通知内容;前台状态下仅显示修改后的内容。希望取消原通知,只显示修改后的内容,使用Plugin.FirebasePushNotification包实现。

原代码:

CrossFirebasePushNotification.Current.OnNotificationReceived += (s, p) =>
{
   ModifyMsgAsync(this, p).Wait();
}            

ModifyMsgAsync(Context context, FirebasePushNotificationDataEventArgs message)
{
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "123");
builder.SetContentTitle("Changed the title");
builder.SetContentText("Message body is changed");

builder.SetPriority(NotificationCompat.PriorityHigh);
builder.SetAutoCancel(true); //disappear after sometime
NotificationManagerCompat managerCompat = NotificationManagerCompat.From(context);
managerCompat.Notify(notification_id, builder.Build());
}

解决步骤

1. 禁用插件的自动通知显示功能

后台状态下重复显示的根源是Plugin.FirebasePushNotification默认会自动展示原通知,和你自定义的修改后通知冲突。只需在初始化插件时关闭自动通知:

在Android项目的MainActivity的OnCreate方法(或自定义Application类的OnCreate)中修改初始化代码:

CrossFirebasePushNotification.Current.Initialize(new FirebasePushNotificationOptions
{
    AutoNotification = false, // 禁用自动显示原通知
    NotificationChannelId = "123" // 和自定义通知的渠道ID保持一致
});

2. 用原通知ID覆盖(可选)

如果需要确保彻底覆盖可能残留的原通知,可以使用推送事件中携带的原通知ID来构建新通知,避免重复:

// 在ModifyMsgAsync方法中
int notificationId = message.NotificationId ?? 123; // 优先使用原通知ID,无则用自定义固定值
managerCompat.Notify(notificationId, builder.Build());

3. 验证后台事件触发

对于纯data payload的推送,插件在后台状态下仍会触发OnNotificationReceived事件,此时你自定义的通知会成为唯一显示的通知。

最终代码示例

// MainActivity中的初始化代码
protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

    // 初始化Firebase推送通知
    CrossFirebasePushNotification.Current.Initialize(new FirebasePushNotificationOptions
    {
        AutoNotification = false,
        NotificationChannelId = "123"
    });

    // 订阅通知接收事件
    CrossFirebasePushNotification.Current.OnNotificationReceived += (s, p) =>
    {
        ModifyMsgAsync(this, p).Wait();
    };

    LoadApplication(new App());
}

// 修改并显示通知的方法
private async Task ModifyMsgAsync(Context context, FirebasePushNotificationDataEventArgs message)
{
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "123");
    builder.SetContentTitle("Changed the title");
    builder.SetContentText("Message body is changed");
    builder.SetPriority(NotificationCompat.PriorityHigh);
    builder.SetAutoCancel(true);

    int notificationId = message.NotificationId ?? 123;
    NotificationManagerCompat managerCompat = NotificationManagerCompat.From(context);
    managerCompat.Notify(notificationId, builder.Build());
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:52:37