如何用Dart代码从Web仪表盘/Flutter App发送Firebase云消息通知
用Dart代码发送Firebase Cloud Messaging(FCM)通知的实现方案
当然可以用Dart代码发送FCM通知,不管是Flutter管理面板App还是Dart后端服务都能实现,以下是贴合你业务场景的具体实现方案:
前置准备
- 已创建Firebase项目并配置FCM服务
- 从Firebase控制台下载服务账号密钥(JSON文件),或获取FCM服务器密钥
- 司机端App已集成FCM,且每个司机的设备FCM令牌已存储到你的数据库中
推荐方案:Dart后端服务发送(更安全)
直接在客户端暴露密钥存在安全风险,建议通过后端处理通知发送逻辑,使用firebase_admin包实现:
1. 添加依赖
在pubspec.yaml中引入包:
dependencies: firebase_admin: ^2.0.0 service_account: ^0.1.0
2. 初始化Firebase Admin
import 'package:firebase_admin/firebase_admin.dart'; import 'package:firebase_admin/src/messaging/messaging.dart'; import 'package:service_account/service_account.dart'; void initFirebaseAdmin() { // 替换为你的服务账号JSON内容 final serviceAccount = ServiceAccount.fromJsonString(''' { "type": "service_account", "project_id": "你的项目ID", // 其他服务账号字段... } '''); FirebaseAdmin.instance.initializeApp( AppOptions( credential: Credential.serviceAccount(serviceAccount), ), ); }
3. 发送审批结果通知
Future<void> sendDriverApprovalNotification(String fcmToken, bool isApproved) async { final messaging = FirebaseAdmin.instance.messaging(); final title = isApproved ? "权限申请已通过" : "权限申请未通过"; final body = isApproved ? "你现在可以接收配送订单了" : "请检查申请信息后重新提交"; try { await messaging.send(Message( token: fcmToken, notification: Notification(title: title, body: body), // 可选:添加数据字段供司机端App处理业务逻辑 data: { "approval_status": isApproved ? "approved" : "rejected", "type": "delivery_permission" }, )); print("通知发送成功"); } catch (e) { print("通知发送失败:$e"); } }
4. 调用时机
当管理员在管理面板完成审批操作后,从数据库取出对应司机的FCM令牌,调用上述函数即可发送通知。
临时方案:Flutter客户端直接发送(仅测试用)
如果需要快速在Flutter管理面板中实现,可通过http包调用FCM REST API(和Postman逻辑一致),但生产环境不推荐,因为服务器密钥易被反编译获取:
1. 添加依赖
dependencies: http: ^1.1.0
2. 发送通知函数
import 'package:http/http.dart' as http; import 'dart:convert'; Future<void> sendNotificationViaHttp(String fcmToken, bool isApproved) async { const serverKey = "你的FCM服务器密钥"; // 从Firebase控制台获取 const fcmUrl = "https://fcm.googleapis.com/fcm/send"; final title = isApproved ? "权限申请已通过" : "权限申请未通过"; final body = isApproved ? "你现在可以接收配送订单了" : "请检查申请信息后重新提交"; final headers = { "Content-Type": "application/json", "Authorization": "key=$serverKey" }; final payload = jsonEncode({ "to": fcmToken, "notification": {"title": title, "body": body}, "data": {"approval_status": isApproved ? "approved" : "rejected"} }); final response = await http.post(Uri.parse(fcmUrl), headers: headers, body: payload); if (response.statusCode == 200) { print("通知发送成功"); } else { print("发送失败:${response.body}"); } }
注意事项
- 定期更新司机端的FCM令牌,避免因令牌过期导致通知发送失败
- 发送失败时可捕获错误并记录,便于后续排查
- 若需批量发送通知,后端方案可使用
messaging.sendMulticast()方法
内容的提问来源于stack exchange,提问作者Mohamed Ali
相关产品推荐
相关产品推荐

