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

如何用Dart代码从Web仪表盘/Flutter App发送Firebase云消息通知

用Dart代码发送Firebase Cloud Messaging(FCM)通知的实现方案

当然可以用Dart代码发送FCM通知,不管是Flutter管理面板App还是Dart后端服务都能实现,以下是贴合你业务场景的具体实现方案:

前置准备

  1. 已创建Firebase项目并配置FCM服务
  2. 从Firebase控制台下载服务账号密钥(JSON文件),或获取FCM服务器密钥
  3. 司机端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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:32:24