Flutter应用FCM测试通知可接收但控制台推送通知无法接收
解决方案
1. 修正Firebase初始化顺序
main 函数中必须先完成Firebase初始化,再注册后台消息回调,修改后的代码如下:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 优先执行Firebase初始化 await Firebase.initializeApp(); // 初始化完成后再注册后台消息回调 FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); await loadImages(); await GetStorage.init(); NotificationService.firebaseMessageInit(); runApp(MyApp()); }
2. 修复构建配置重复声明问题
project/build.gradle 中重复声明了Android Gradle插件版本,会导致构建异常,删除重复声明即可:
dependencies { classpath 'com.android.tools.build:gradle:4.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.8' // 删除重复的 classpath 'com.android.tools.build:gradle:3.2.1' 声明 }
3. 补充Android通知渠道配置
Android 8.0及以上系统要求所有推送通知必须绑定通知渠道,否则无法正常弹出通知。你需要在 NotificationService.firebaseMessageInit() 方法中添加通知渠道创建逻辑:
// 放在NotificationService.firebaseMessageInit()方法内执行 if (Platform.isAndroid) { const AndroidNotificationChannel channel = AndroidNotificationChannel( 'high_importance_channel', // 自定义渠道ID,后续需保持一致 '高优先级通知', // 用户可见的渠道名称 description: '用于接收应用推送的重要通知', // 渠道描述 importance: Importance.max, ); final FlutterLocalNotificationsPlugin notificationsPlugin = FlutterLocalNotificationsPlugin(); await notificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>() ?.createNotificationChannel(channel); }
同时在 AndroidManifest.xml 的 <application> 标签内添加FCM默认通知渠道配置,值和上面定义的渠道ID保持一致:
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="high_importance_channel" />
4. 调整FCM消息处理逻辑
FCM的消息分为两类,回调触发规则不同:
- 仅通知类型消息:应用在后台时会由系统直接弹出通知,不会触发
onBackgroundMessage回调,只有点击通知时才会触发onMessageOpenedApp回调 - 通知+数据混合类型消息:应用在后台时系统会弹出通知,同时会触发
onBackgroundMessage回调
你通过token发送的测试消息属于数据类型,所以可以正常触发回调,而FCM控制台默认发送的是仅通知类型消息,所以不会触发后台回调。你可以在控制台推送页面的「其他选项」中添加任意自定义数据,消息就会变为混合类型,即可正常触发后台回调。
另外应用处于前台时,FCM默认不会自动弹出通知,你当前仅在 onMessage 回调中打印了日志,没有主动调用本地通知API弹框,会误以为没有收到消息,需要补充主动弹通知的逻辑。
内容的提问来源于stack exchange,提问作者Mehmet NURAYDIN
相关产品推荐
相关产品推荐

