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

Flutter集成FCM后安卓模拟器推送通知不显示问题求助

Flutter FCM推送通知配置问题:模拟器无通知、权限未弹出、发送数为0

我正在尝试为Flutter应用配置Firebase Cloud Messaging(FCM)推送通知,目前先从手动发送通知负载、让安卓应用作为后台通知处理开始,但模拟器中完全没显示通知。此外,打开模拟器里的应用时,没有收到通知权限请求,Firebase控制台显示通知发送数为0。我的应用同时使用Cloud Firestore和Google服务(因此请求了位置权限)。

以下是我的main.dart代码:

import 'package:flutter/material.dart';
import 'package:redue/Screens/Welcome%20Screen/WelcomeScreen.dart';
import 'pages/menu.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
import 'pages/settings.dart';
import 'package:location/location.dart';
import 'pages/settings.dart';
import 'package:firebase_messaging/firebase_messaging.dart';

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();

  print("Handling a background message: ${message.messageId}");
}

final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;
Future main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);

  Location location = new Location();

  bool _serviceEnabled;
  PermissionStatus _permissionGranted;

  _serviceEnabled = await location.serviceEnabled();
  if (!_serviceEnabled) {
    _serviceEnabled = await location.requestService();
    if (!_serviceEnabled) {
      return null;
    }
  }

  _permissionGranted = await location.hasPermission();
  if (_permissionGranted == PermissionStatus.denied) {
    _permissionGranted = await location.requestPermission();
    if (_permissionGranted != PermissionStatus.granted) {
      return null;
    }
  }
  _firebaseMessaging.requestPermission(
    alert: true,
    announcement: false,
    badge: true,
    carPlay: false,
    criticalAlert: false,
    provisional: false,
    sound: true,
  );
  FirebaseMessaging messaging = FirebaseMessaging.instance;
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    print('Got a message whilst in the foreground!');
    print('Message data: ${message.data}');

    if (message.notification != null) {
      print('Message also contained a notification: ${message.notification}');
    }
  });
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // This widget is the root of your application.
  @override
  void initState() {
    super.initState();
    currentTheme.addListener(() {
      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "ReDue",
      debugShowCheckedModeBanner: false,
      theme: ThemeData.light(),
      darkTheme: ThemeData.dark(),
      home: WelcomeScreen(),
    );
  }
}

排查与解决建议

  • 修复权限请求逻辑:

    1. 安卓13及以上版本需要单独请求POST_NOTIFICATIONS权限,调用requestPermission()后要处理返回的权限状态,确保用户授权。
    2. 当前位置权限逻辑存在问题:如果用户拒绝位置权限,main函数直接返回null,导致后续FCM的权限请求、消息监听等代码完全未执行。调整位置权限处理逻辑,不要直接退出,而是提示用户后继续执行FCM初始化。
  • 修正后台消息处理函数:
    后台消息处理函数_firebaseMessagingBackgroundHandler中重复调用Firebase.initializeApp()是不必要的,main函数已完成初始化,可修改为:

    Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
      print("Handling a background message: ${message.messageId}");
      // 如需处理data消息,可在此手动构建通知显示
    }
    
  • 确保模拟器环境正常:
    选择带Google APIs的安卓系统镜像(模拟器需支持Google Play服务),并确保模拟器已联网、登录Google账号,否则FCM无法正常推送。

  • 验证FCM令牌获取:
    添加代码获取并打印FCM令牌,确认应用成功注册到FCM:

    // 在main函数的FCM初始化后添加
    String? fcmToken = await _firebaseMessaging.getToken();
    print('FCM令牌: $fcmToken');
    

    如果令牌为空,检查google-services.json是否正确放置在android/app目录下,以及安卓项目build.gradle是否正确引入FCM依赖。

  • 检查通知负载格式:
    手动发送通知时必须包含notification字段,才能让系统自动显示后台通知,示例负载结构:

    {
      "notification": {
        "title": "测试通知",
        "body": "这是一条后台测试通知"
      },
      "to": "你的FCM令牌"
    }
    

    若仅发送data字段,需在后台消息处理函数中手动构建通知并显示。

  • 确认Firebase项目配置:
    确保Firebase项目中已正确添加安卓应用,包名与项目包名完全一致,且google-services.json是最新下载的版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:50:35