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

