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

Flutter应用被杀死后Firebase通知无法显示问题求助

Flutter Firebase通知在应用杀死后不显示的解决方案

针对你遇到的应用前台/后台未杀死时通知正常,杀死后无法显示的问题,可按以下步骤排查修复:

1. 补充Firebase消息服务配置到AndroidManifest.xml

你的AndroidManifest.xml中缺少Firebase Messaging Service的声明,导致系统无法在应用杀死后触发消息处理。添加以下代码到<application>标签内:

<service
    android:name=".MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

如果不需要自定义服务,也可以使用Firebase默认实现,将android:name改为com.google.firebase.messaging.FirebaseMessagingService。

2. 在后台消息处理器中主动创建本地通知

当应用被杀死时,系统不会自动展示Firebase消息,必须通过本地通知插件手动创建。首先确保依赖flutter_local_notifications,然后修改_firebaseMessagingBackgroundHandler:

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

final FlutterLocalNotificationsPlugin _localNotifications = FlutterLocalNotificationsPlugin();

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  print("Handling a background message: ${message.messageId}");

  // 初始化本地通知(后台环境需单独初始化)
  const AndroidInitializationSettings androidInit =
      AndroidInitializationSettings('@mipmap/ic_launcher');
  const InitializationSettings initSettings =
      InitializationSettings(android: androidInit);
  await _localNotifications.initialize(initSettings);

  // 构建并显示通知
  const AndroidNotificationDetails androidDetails = AndroidNotificationDetails(
      'notification_channel_id', '通知渠道名称',
      channelDescription: '用于展示Firebase后台通知',
      importance: Importance.max,
      priority: Priority.high);
  const NotificationDetails notificationDetails =
      NotificationDetails(android: androidDetails);
  
  await _localNotifications.show(
      message.hashCode,
      message.notification?.title ?? '新通知',
      message.notification?.body ?? '您有一条新消息',
      notificationDetails,
      payload: json.encode(message.data));
}

3. 初始化Android通知渠道(Android 8.0+要求)

Android 8.0及以上系统需要提前创建通知渠道,在main方法中添加初始化代码:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  // 创建通知渠道
  const AndroidNotificationChannel channel = AndroidNotificationChannel(
    'notification_channel_id',
    '高优先级通知',
    description: '接收Firebase后台消息的通知渠道',
    importance: Importance.high,
  );

  await _localNotifications
      .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(channel);

  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  // 其他初始化逻辑...
  runApp(YourApp());
}

4. 检查消息类型与发送方式

  • 确保发送的是包含notification字段的通知消息,而非纯数据消息。纯数据消息需要完全手动处理展示逻辑。
  • 如果通过Firebase控制台发送,确认勾选了"通知"选项卡,而非仅"数据"选项卡。

5. 补充Android 13+通知权限

针对Android 13及以上设备,添加POST_NOTIFICATIONS权限到AndroidManifest.xml的<uses-permission>区域:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

完成以上步骤后,重新打包测试应用杀死后的通知接收情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:50:18