Flutter中通过REST API发送定时FCM推送:时间参数传递失败求助
在Flutter中通过REST API实现FCM定时推送通知
一、FCM请求体中正确传递定时参数
你之前把event_time放在notification字段里是错误的,FCM用于定时推送的参数是**schedule_time,且必须放在请求体的根层级**,格式需遵循RFC3339标准(UTC时间,例如"2024-06-15T14:30:00Z")。
修改后的完整请求体示例:
{ "registration_ids": [ "fNsi-sHiQDSWcNdx5Y2Nf9:APA91bEewR3VbuPVJO3qFDlcmqS6rp5fZilITgZJfl61JOsje6OEP13RjhxAn-0JRzf0-u8Mg-OBAKxRKtKRtpeisZagHJZsNYa_zat--1iyemwUSxdZIMRt2jxfZMiZ9Od4mk2DmznG", "fyYtfww_QzOTVh1aFyOaTZ:APA91bFih7TD9Q04kb03Ju1zUJ66N_2yMwo2dUCr_ZJJs-NKv3AaEAimGV2lxm7kgIsVlJSXRmrau-VFZ_52AS9tqobl-vP7iXbOOT35kdEFVEROMotr4AiksD2b5vE_TWWyai3BbH9E" ], "notification": { "body": "killed", "title": "killed title", "android_channel_id": "push_notification", "sound": false }, "data": { "body": "data body", "title": "Data", "_id": 34534 }, "android": { "priority": "high" }, "schedule_time": "2024-06-15T14:30:00Z" }
关键注意点:
schedule_time必须是未来的时间,且不能超过当前时间4周(FCM的最大定时范围)- 时间格式必须为UTC标准,避免时区偏差导致推送时间错误
二、Flutter中通过REST API发送定时推送
使用Flutter的http包发起POST请求到FCM推送端点,步骤如下:
- 在
pubspec.yaml中添加http依赖:
dependencies: flutter: sdk: flutter http: ^1.2.1
- 编写发送请求的代码:
import 'dart:convert'; import 'package:http/http.dart' as http; Future<void> sendScheduledPushNotification() async { final String fcmServerKey = '你的FCM服务器密钥'; final Uri fcmEndpoint = Uri.parse('https://fcm.googleapis.com/fcm/send'); final Map<String, dynamic> requestBody = { "registration_ids": [ "你的设备注册ID", ], "notification": { "body": "定时推送测试", "title": "定时通知", "android_channel_id": "push_notification", "sound": false }, "data": { "body": "data body", "title": "Data", "_id": 34534 }, "android": { "priority": "high" }, "schedule_time": "2024-06-15T14:30:00Z" }; final response = await http.post( fcmEndpoint, headers: { 'Content-Type': 'application/json', 'Authorization': 'key=$fcmServerKey', }, body: jsonEncode(requestBody), ); if (response.statusCode == 200) { print('定时推送请求已提交成功'); print('响应内容: ${response.body}'); } else { print('请求失败,状态码: ${response.statusCode}'); print('错误信息: ${response.body}'); } }
额外提醒:
- FCM服务器密钥需从Firebase控制台「项目设置」→「云消息传递」中获取
- 不要在客户端代码中硬编码服务器密钥(存在安全风险),建议通过你的后端服务转发请求,客户端仅调用后端接口
- 确保设备注册ID有效,否则会返回推送失败的响应
内容的提问来源于stack exchange,提问作者Som Gupta
相关产品推荐
相关产品推荐

