Flutter集成Firebase Messaging与本地通知的Release模式问题排查
Release模式下Firebase通知声音丢失、前台图标消失解决方案
一、自定义通知声音丢失修复
1. 确认音频资源配置
把自定义声音文件(比如cat.mp3或cat.ogg)放到android/app/src/main/res/raw目录下,文件名只能用小写字母、数字和下划线,不能带特殊字符。同时检查android/app/build.gradle的sourceSets配置,确保res/raw被正确包含:
android { sourceSets { main { res.srcDirs = ['src/main/res'] } } }
2. 阻止ProGuard/R8混淆音频资源
在android/app/proguard-rules.pro里加以下规则,防止音频资源被混淆移除:
-keep class android.media.RawResourceAudioTrack { *; } -keepresourcenames res/raw/*
3. 提前创建通知通道
Android通知通道一旦创建,后续代码修改参数不会生效。建议在初始化本地通知时提前创建通道,避免每次收到消息重复创建:
void _initializeLocalNotifications() { const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('launcher_icon'); final InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid); _localNotifications.initialize(initializationSettings); // 提前创建通知通道 final AndroidNotificationChannel channel = AndroidNotificationChannel( 'high_importance_channel', 'High Importance Notifications', description: 'This channel is used for important notifications.', importance: Importance.max, sound: RawResourceAndroidNotificationSound('cat'), ); _localNotifications.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.createNotificationChannel(channel); }
如果之前已经创建过通道,测试前先卸载应用,清除旧的通道配置。
二、前台通知图标丢失修复
1. 使用符合规范的通知图标
Android要求通知图标必须是透明背景的单色(白色)图标,把图标放到android/app/src/main/res/drawable-xxxhdpi等对应分辨率目录下,或者用mipmap目录的图标。修改初始化代码的图标路径:
const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/launcher_icon');
2. 保留图标资源不被混淆
在proguard-rules.pro添加规则,防止图标资源被ProGuard处理:
-keepresourcenames drawable/* -keepresourcenames mipmap/*
3. 检查Firebase消息的图标配置
如果是Firebase控制台发送的通知,要在控制台指定通知图标;如果是接口发送消息,payload里要带上android.icon字段:
{ "notification": { "title": "测试通知", "body": "测试内容", "android": { "icon": "@mipmap/launcher_icon" } } }
三、额外验证项
- 确认
google-services.json已正确放在android/app目录下,android/app/build.gradle末尾已添加apply plugin: 'com.google.gms.google-services'; - 测试Release包前先卸载Debug版本,避免缓存干扰。
内容的提问来源于stack exchange,提问作者daphneyong11
相关产品推荐
相关产品推荐

