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

Flutter集成Firebase推送通知无显示问题求助

Flutter Firebase推送通知不显示问题解决

问题分析

你已经获取到FCM Token,且日志显示broadcast received for message(消息已被接收),但通知未弹出,核心原因是:

  • 未配置前台通知展示逻辑(默认FCM不会在前台自动弹出通知)
  • Android 8+未创建通知通道(系统强制要求)
  • 缺少后台/终止状态的通知处理配置

日志中的analytics library is missing警告不影响通知功能,仅为Firebase事件日志缺失,可选择消除。


具体解决步骤

1. 添加必要依赖

在pubspec.yaml中补充依赖:

dependencies:
  firebase_core: ^latest_version
  firebase_messaging: ^latest_version
  flutter_local_notifications: ^latest_version # 用于前台展示通知
  # 可选:添加消除analytics警告
  firebase_analytics: ^latest_version

(将latest_version替换为pub.dev上的最新版本号)

2. 完善FirebaseApi类

修改firebase_api.dart,添加通知展示、通道创建和消息监听逻辑:

import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

class FirebaseApi {
  final _firebaseMessaging = FirebaseMessaging.instance;
  final _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

  Future<void> initNotifications() async {
    // 请求用户通知权限
    await _firebaseMessaging.requestPermission(
      alert: true,
      badge: true,
      sound: true,
    );

    // 获取并打印FCM Token
    final fCMToken = await _firebaseMessaging.getToken();
    print('Token: $fCMToken');

    // 初始化本地通知插件及Android通道
    await _initLocalNotifications();

    // 监听前台收到的消息,弹出通知
    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
      final notification = message.notification;
      final android = message.notification?.android;

      if (notification != null && android != null) {
        _flutterLocalNotificationsPlugin.show(
          notification.hashCode,
          notification.title,
          notification.body,
          NotificationDetails(
            android: AndroidNotificationDetails(
              'push_channel', // 自定义通道ID
              '推送通知', // 自定义通道名称
              channelDescription: '接收Firebase推送通知', // 自定义通道描述
              importance: Importance.max,
              priority: Priority.high,
              icon: '@mipmap/ic_launcher', // 关联应用图标
            ),
          ),
        );
      }
    });

    // 处理后台/终止状态下点击通知的逻辑
    FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
      print('通知被点击,数据:${message.data}');
      // 可添加页面跳转等业务逻辑
    });
  }

  // 初始化本地通知及Android通道
  Future<void> _initLocalNotifications() async {
    // Android初始化配置
    const androidInit = AndroidInitializationSettings('@mipmap/ic_launcher');
    // iOS初始化配置(可选)
    const iosInit = DarwinInitializationSettings();

    await _flutterLocalNotificationsPlugin.initialize(
      const InitializationSettings(android: androidInit, iOS: iosInit),
    );

    // 创建Android通知通道(Android 8+必须)
    const channel = AndroidNotificationChannel(
      'push_channel',
      '高优先级通知',
      description: '用于接收Firebase推送的重要通知',
      importance: Importance.max,
    );
    await _flutterLocalNotificationsPlugin
        .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
        ?.createNotificationChannel(channel);
  }

  // 后台消息处理器(应用终止时触发)
  static Future<void> backgroundMessageHandler(RemoteMessage message) async {
    print('后台收到消息:${message.messageId}');
  }
}

3. 配置后台消息处理

修改main.dart,注册后台消息处理器:

import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
// 可选:引入analytics
// import 'package:firebase_analytics/firebase_analytics.dart';

import 'api/firebase_api.dart';
import 'firebase_options.dart';
import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  
  // 注册后台消息处理器
  FirebaseMessaging.onBackgroundMessage(FirebaseApi.backgroundMessageHandler);
  
  // 可选:初始化analytics消除警告
  // await FirebaseAnalytics.instance.setAnalyticsCollectionEnabled(true);
  
  await FirebaseApi().initNotifications();
  runApp(const TesMagenta());
}

// 示例应用组件
class TesMagenta extends StatelessWidget {
  const TesMagenta({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(home: Scaffold(body: Center(child: Text('测试推送'))));
  }
}

4. 检查平台配置

Android端

确保android/app/src/main/AndroidManifest.xml包含以下配置:

<!-- 通知权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

<!-- Firebase Messaging服务 -->
<service
    android:name="com.google.firebase.messaging.FirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

iOS端

在ios/Runner/Info.plist中添加:

<key>FirebaseAppDelegateProxyEnabled</key>
<false/>
<key>UIBackgroundModes</key>
<array>
    <string>remote-notification</string>
</array>

并在Xcode中开启Push Notifications权限(Signing & Capabilities -> 添加该功能)。


测试验证

  1. 重新运行应用,确认Token正常打印
  2. 在Firebase控制台发送测试通知时,确保填写正确的Token,且标题、内容不为空
  3. 分别测试应用在前台、后台、终止状态下的通知接收情况

内容的提问来源于stack exchange,提问作者Asa Marsal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:47:32