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

在Flutter中使用FCM发送图片推送通知的可行性及问题咨询

Flutter + FCM 发送图片推送通知解决方案

嘿,这两个问题的答案都是肯定的——Flutter借助FCM完全能实现带图片的推送通知,你之前用firebase_messaging发不了,大概率是没配置对推送负载或者没结合本地通知插件处理,我给你一步步讲清楚:

1. 能不能用FCM发送图片推送?

当然可以!FCM本身就支持推送带图片的通知,不管是Android还是iOS平台,只要在推送负载里正确配置图片相关字段,再配合Flutter客户端的通知处理逻辑就能实现。

2. 怎么用firebase_messaging实现图片推送?

firebase_messaging主要负责接收FCM消息,要显示带图片的通知,还得搭配flutter_local_notifications包来处理图片加载和自定义通知样式,具体分两步:

第一步:配置FCM推送负载

不管你是用Firebase控制台还是自己的后端发送推送,都需要在通知负载里添加图片字段:

  • Firebase控制台操作:在创建通知时,找到「高级选项」,在「通知」标签下填写「图片URL」(公网可访问的图片地址);或者在「自定义数据」里添加image字段,值为图片URL。
  • 后端代码示例(HTTP请求):
{
  "notification": {
    "title": "新消息",
    "body": "这是一条带图片的推送",
    "image": "https://example.com/your-image.jpg"
  },
  "to": "设备的FCM令牌"
}

注意:iOS平台需要额外设置apns.payload.aps.mutable-content: 1,这样才能让应用扩展处理图片下载和显示。

第二步:Flutter客户端处理通知

  1. 添加依赖:在pubspec.yaml里加入所需包:
dependencies:
  firebase_messaging: ^latest_version
  flutter_local_notifications: ^latest_version
  http: ^latest_version # 用来下载图片
  path_provider: ^latest_version # 用来保存图片到本地
  1. 初始化本地通知插件:
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

Future<void> initNotifications() async {
  // Android初始化配置
  const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher');
  // iOS初始化配置
  const IOSInitializationSettings initializationSettingsIOS = IOSInitializationSettings();
  
  const InitializationSettings initializationSettings = InitializationSettings(
    android: initializationSettingsAndroid,
    iOS: initializationSettingsIOS,
  );
  
  await flutterLocalNotificationsPlugin.initialize(initializationSettings);
  
  // 创建Android通知渠道(Android 8.0+必需)
  const AndroidNotificationChannel channel = AndroidNotificationChannel(
    'image_notification_channel',
    '图片通知频道',
    description: '用于显示带图片的推送通知',
    importance: Importance.max,
  );
  await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.createNotificationChannel(channel);
}
  1. 处理FCM消息并显示带图片的通知:
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as path;

FirebaseMessaging messaging = FirebaseMessaging.instance;

void setupFCMListeners() {
  // 处理前台收到的消息
  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    if (message.notification != null) {
      _showImageNotification(message.notification!);
    }
  });
}

Future<void> _showImageNotification(RemoteNotification notification) async {
  String? imageUrl = notification.android?.imageUrl ?? notification.apple?.imageUrl;
  if (imageUrl == null) return;

  // 下载图片到本地
  String imagePath = await _downloadImage(imageUrl);

  // 构建通知详情
  NotificationDetails notificationDetails = NotificationDetails(
    android: AndroidNotificationDetails(
      'image_notification_channel',
      '图片通知频道',
      description: '带图片的推送',
      largeIcon: FilePathAndroidBitmap(imagePath),
      styleInformation: BigPictureStyleInformation(
        FilePathAndroidBitmap(imagePath),
        hideExpandedLargeIcon: true,
      ),
    ),
    iOS: IOSNotificationDetails(
      attachments: [IOSNotificationAttachment(imagePath)],
    ),
  );

  // 显示通知
  await flutterLocalNotificationsPlugin.show(
    notification.hashCode,
    notification.title,
    notification.body,
    notificationDetails,
  );
}

Future<String> _downloadImage(String url) async {
  final response = await http.get(Uri.parse(url));
  final directory = await getApplicationDocumentsDirectory();
  final fileName = path.basename(url);
  final filePath = '${directory.path}/$fileName';
  
  final file = File(filePath);
  await file.writeAsBytes(response.bodyBytes);
  return filePath;
}

额外注意事项

  • 图片URL必须是公网可访问的,不能是本地地址;
  • iOS平台需要创建「Notification Service Extension」来处理后台推送的图片下载,不然后台收到的图片通知可能无法显示;
  • Android平台要确保AndroidManifest.xml里添加了INTERNET权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:06:06