在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客户端处理通知
- 添加依赖:在
pubspec.yaml里加入所需包:
dependencies: firebase_messaging: ^latest_version flutter_local_notifications: ^latest_version http: ^latest_version # 用来下载图片 path_provider: ^latest_version # 用来保存图片到本地
- 初始化本地通知插件:
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); }
- 处理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
相关产品推荐
相关产品推荐

