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

