Xamarin Forms Android端推送通知不显示在通知栏问题
Android端Plugin.FirebasePushNotification接收推送但通知栏无显示、无提示音问题解决
问题概述
基于Xamarin Forms的新项目使用Plugin.FirebasePushNotification插件实现推送功能:
- iOS端推送完全正常,通知栏显示、提示音均正常
- Android端通过Postman或Firebase发送推送时,
OnNotificationReceived事件能正常触发(调试模式下可确认已接收消息),但通知栏无任何显示,也没有推送提示音 - 关闭或强制终止应用后问题依旧,排除推送Payload本身的问题
可能原因
- Android 8.0(API 26+)系统要求必须创建通知渠道才能显示通知,未配置渠道会导致通知被系统拦截
- FirebasePushNotificationManager初始化时未关联正确的通知渠道
- 应用的通知权限未开启
- 推送Payload结构未包含Android通知所需的必要字段
解决方案
1. 配置Android通知渠道(API 26+)
在Android项目的MainActivity.cs中添加通知渠道创建逻辑,并在初始化FirebasePushNotification时指定渠道ID:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); FirebaseApp.InitializeApp(this); // 为Android 8.0+创建通知渠道 if (Build.VERSION.SdkInt >= BuildVersionCodes.O) { const string channelId = "default_push_channel"; const string channelName = "推送通知渠道"; const string channelDesc = "接收应用所有推送通知"; var importance = NotificationImportance.Default; var notificationChannel = new NotificationChannel(channelId, channelName, importance) { Description = channelDesc }; var notificationManager = (NotificationManager)GetSystemService(NotificationService); notificationManager.CreateNotificationChannel(notificationChannel); // 初始化时绑定渠道ID FirebasePushNotificationManager.Initialize(this, true, channelId); } else { FirebasePushNotificationManager.Initialize(this, true); } LoadApplication(new App()); }
2. 确保推送Payload包含必要字段
如果使用data-only推送,插件可能无法自动构建通知,建议改用包含notification字段的Payload,确保系统能识别并显示通知:
{ "to": "目标设备的FCM Token", "notification": { "title": "测试推送标题", "body": "测试推送内容", "sound": "default" }, "data": { "custom_data": "自定义内容" } }
3. 检查并开启应用通知权限
- 手动进入设备设置 → 应用管理 → 找到你的应用 → 通知 → 开启所有通知权限
- 针对Android 13+,也可以在代码中动态请求通知权限:
// 在MainActivity中重写权限回调 public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults); } // 在启动时请求权限 if (Build.VERSION.SdkInt >= BuildVersionCodes.Tiramisu) { if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.PostNotifications) != Permission.Granted) { ActivityCompat.RequestPermissions(this, new[] { Manifest.Permission.PostNotifications }, 1001); } }
4. 手动构建通知(可选兜底方案)
如果自动通知仍不生效,可以在OnNotificationReceived事件中手动构建并显示通知:
在共享项目的App.xaml.cs中添加:
public App() { InitializeComponent(); CrossFirebasePushNotification.Current.OnNotificationReceived += (sender, args) => { if (Device.RuntimePlatform == Device.Android) { var context = Android.App.Application.Context; var notificationManager = context.GetSystemService(Context.NotificationService) as NotificationManager; const string channelId = "default_push_channel"; // 创建跳转Intent var intent = new Intent(context, typeof(MainActivity)); intent.AddFlags(ActivityFlags.ClearTop); var pendingIntent = PendingIntent.GetActivity(context, 0, intent, PendingIntentFlags.OneShot | PendingIntentFlags.Immutable); // 构建通知 var notificationBuilder = new Notification.Builder(context, channelId) .SetContentTitle(args.Data.TryGetValue("title", out var title) ? title.ToString() : "新通知") .SetContentText(args.Data.TryGetValue("body", out var body) ? body.ToString() : "您有一条新消息") .SetSmallIcon(Resource.Drawable.ic_notification) // 替换为你的应用通知图标 .SetAutoCancel(true) .SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification)) .SetContentIntent(pendingIntent); // 显示通知 notificationManager?.Notify(DateTime.Now.Millisecond, notificationBuilder.Build()); } }; }
内容的提问来源于stack exchange,提问作者Nabil Akhlaque
相关产品推荐
相关产品推荐

