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

MAUI Android不同构建配置下Firebase推送通知图标不显示问题

MAUI Android 多构建配置下Firebase前台通知图标不显示问题

问题背景

使用VS 2022开发MAUI Android应用,包含Release和Release_GOU两个独立构建配置(二者Build ID不同),共用同一个MessagingServiceFirebase类处理应用前台状态下的Firebase推送通知。当前遇到的问题:

  • Release配置:前台通知图标显示正常
  • Release_GOU配置:前台状态下,无论使用默认图标还是代码指定图标,通知图标均无法显示;但应用后台时,任意图标都能正常显示
  • 已配置两个独立的AndroidManifest文件,怀疑Release_GOU配置下OnMessageReceived方法未触发

现有配置与代码

Release配置的AndroidManifest片段

<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_def_logo" />
<meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/notification_color" />
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id" />

Release_GOU配置的AndroidManifest片段

<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_gou_logo" />
<meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/notification_color" />
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id_gou" />

MessagingServiceFirebase核心代码

[Service(Exported = false)]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
internal class MessagingServiceFirebase : FirebaseMessagingService
{
    public override void OnNewToken(string token)
    {
        base.OnNewToken(token);
        SecureStorage.SetAsync("firebaseToken", token);
        var deviceId = AndroidProvider.Settings.Secure.GetString(AndroidApp.Application.Context.ContentResolver, AndroidProvider.Settings.Secure.AndroidId);
        if (deviceId != null)
        {
            SecureStorage.SetAsync("deviceId", deviceId);
        }
    }

    public override async void OnMessageReceived(RemoteMessage message)
    {
        try
        {
            int NOTIFICATION_ID = new Random().Next(1000);
            var uri = message.Data.ContainsKey("uri") ? message.Data["uri"] : "";
            var image = message.Data.ContainsKey("image") ? message.Data["image"] : "";
            Bitmap bigPicture = null;

            var largeIcon = await Android.Graphics.BitmapFactory.DecodeResourceAsync(Resources, Microsoft.Maui.Resource.Drawable.logo_colored);

            NotifyMessage msg = new NotifyMessage()
            {
                id = message.GetNotification().JniIdentityHashCode.ToString(),
                title = message.GetNotification().Title,
                message = message.GetNotification().Body,
                uri = uri,
                count = 1,
                data = null,
                image = image
            };

            var intent = new Intent(this, typeof(MainActivity));
            intent.AddFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop);
            var pendingIntent = PendingIntent.GetActivity(this, NOTIFICATION_ID, intent, PendingIntentFlags.UpdateCurrent | PendingIntentFlags.Immutable);
            var notificationBuilder = new NotificationCompat.Builder(this, MainActivity.CHANNEL_ID)
#if RELEASE_GOU
                                      .SetSmallIcon(Resource.Drawable.ic_stat_gou_logo)
#else
                                      .SetSmallIcon(Resource.Drawable.ic_stat_def_logo)
#endif
                                      .SetContentTitle(msg.title)
                                      .SetContentText(msg.message)
                                      .SetAutoCancel(true)
                                      .SetColor(Android.Graphics.Color.ParseColor(AppSettingKey.statusBarColor))
                                      .SetColorized(true)
                                      .SetLargeIcon(largeIcon)
                                      .SetPriority(NotificationCompat.PriorityHigh)
                                      .SetStyle(new NotificationCompat.BigTextStyle().BigText(msg.message))
                                      .SetStyle(new NotificationCompat.BigPictureStyle().BigPicture(bigPicture))
                                      .SetContentIntent(pendingIntent);

            var notificationManager = NotificationManagerCompat.From(this);
            notificationManager.Notify(NOTIFICATION_ID, notificationBuilder.Build());
        }
        catch (Exception)
        {
        }
    }

    public override void OnDeletedMessages()
    {
    }
}

排查与解决步骤

1. 确认RELEASE_GOU编译符号配置

右键项目→属性→生成→条件编译符号,检查Release_GOU配置下是否添加了RELEASE_GOU符号。如果未添加,#if RELEASE_GOU分支不会执行,会默认使用ic_stat_def_logo,若该图标在Release_GOU包中不存在,就会显示空白。

2. 验证OnMessageReceived是否触发

  • 在OnMessageReceived方法开头添加日志输出(如Log.Debug("FirebaseMsg", "Release_GOU: OnMessageReceived triggered"))
  • 修改catch块,输出异常详情:catch (Exception ex) { Log.Error("FirebaseMsg", ex.ToString()); }
  • 通过Logcat查看日志,确认方法是否执行、是否存在异常
  • 注意:Firebase推送分通知消息和数据消息,仅数据消息会在前台触发OnMessageReceived;若为通知消息,前台状态下系统会直接显示通知,不走自定义服务,需确认推送消息类型。

3. 检查通知通道ID匹配性

Release_GOU的Manifest指定了default_notification_channel_id_gou,但代码中创建通知用的是MainActivity.CHANNEL_ID,需确认MainActivity.CHANNEL_ID在Release_GOU配置下是否等于default_notification_channel_id_gou的字符串值,通道不匹配可能导致图标失效。

4. 确认图标资源有效性

  • 检查ic_stat_gou_logo图标是否存在于Release_GOU配置的资源目录中,且符合Android通知图标规范(建议用透明背景的单色图标,尺寸匹配对应dpi要求)
  • 打印Resource.Drawable.ic_stat_gou_logo的值,确认不为0(0表示资源未找到)

5. 检查服务注册正确性

确认Release_GOU的Manifest中是否正确注册了MessagingServiceFirebase服务,MAUI可能自动生成Manifest,若手动修改了独立Manifest,需确保服务声明未缺失。

6. 修复异常吞入问题

当前代码中OnMessageReceived的catch块直接吞掉所有异常,导致无法排查构建通知时的错误(如资源找不到、颜色解析失败等),必须输出异常日志才能定位问题。

内容的提问来源于stack exchange,提问作者D.madushanka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:39:58