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

Xamarin Forms Android端推送通知不显示在通知栏问题

Android端Plugin.FirebasePushNotification接收推送但通知栏无显示、无提示音问题解决

问题概述

基于Xamarin Forms的新项目使用Plugin.FirebasePushNotification插件实现推送功能:

  • iOS端推送完全正常,通知栏显示、提示音均正常
  • Android端通过Postman或Firebase发送推送时,OnNotificationReceived事件能正常触发(调试模式下可确认已接收消息),但通知栏无任何显示,也没有推送提示音
  • 关闭或强制终止应用后问题依旧,排除推送Payload本身的问题

可能原因

  1. Android 8.0(API 26+)系统要求必须创建通知渠道才能显示通知,未配置渠道会导致通知被系统拦截
  2. FirebasePushNotificationManager初始化时未关联正确的通知渠道
  3. 应用的通知权限未开启
  4. 推送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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:45:40