API更新时如何向Flutter应用用户发送Firebase推送通知?
Flutter + Firebase 实现Twitter内容更新推送方案
1. Firebase 后端逻辑(核心检测逻辑)
- 优先使用Cloud Functions 定时触发器轮询Twitter API,可根据你的需求设置轮询间隔(比如每15分钟一次),注意不要超过Twitter API的速率限制,避免被限流。
- 每次拉取到最新内容后,和Firestore中存储的上一次拉取的最新内容ID做比对,筛选出未推送过的新内容。
- 检测到新内容后,通过Firebase Cloud Messaging(FCM)向目标用户推送通知:你可以提前将用户的FCM设备令牌存储在Firestore的用户文档中,支持按用户订阅的新闻标签定向推送,也可以直接用FCM主题订阅功能实现广播推送。
- 要新增已推送内容ID的记录逻辑,避免重复向用户推送相同内容。
Cloud Functions 核心参考代码(Node.js):
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); const db = admin.firestore(); // 每15分钟触发一次检测 exports.checkTwitterNewsUpdate = functions.pubsub.schedule("every 15 minutes").onRun(async () => { // 调用Twitter API拉取目标新闻内容 const latestTweets = await twitterClient.tweets.searchRecent({ query: "你的新闻检索关键词" }); // 读取上一次记录的最新推文ID const lastRecordSnap = await db.collection("appConfig").doc("lastTwitterNews").get(); const lastRecordId = lastRecordSnap.exists ? lastRecordSnap.data().tweetId : ""; // 筛选新内容 const newTweets = latestTweets.data.filter(tweet => tweet.id > lastRecordId); if (newTweets.length === 0) return; // 更新最新推文ID记录 await db.collection("appConfig").doc("lastTwitterNews").set({ tweetId: newTweets[0].id }); // 发送FCM推送,此处用主题推送为例,也可以按需获取用户令牌列表定向推送 await admin.messaging().send({ notification: { title: "新闻更新提醒", body: newTweets[0].text.length > 50 ? `${newTweets[0].text.slice(0, 50)}...` : newTweets[0].text }, topic: "twitterNewsUpdates" }); return null; });
2. Flutter 客户端逻辑
- 集成
firebase_messaging和flutter_local_notifications两个依赖包。 - 应用启动时向用户申请通知权限,获取当前设备的FCM令牌,同步上传到Firestore对应用户的文档中,同时要监听FCM令牌更新事件,及时同步最新令牌到后端,避免推送失效。
- 配置不同状态下的通知接收逻辑:
- 应用在后台/被杀死状态时,FCM会自动触发系统通知展示
- 应用在前台运行时,调用
flutter_local_notifications的API主动弹出通知
- 配置通知点击跳转逻辑:解析通知携带的payload参数,用户点击通知后直接跳转到对应新闻的详情页。
Flutter 权限申请参考代码:
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; Future<void> initPushNotification(String userId) async { final FirebaseMessaging messaging = FirebaseMessaging.instance; // 申请通知权限 NotificationSettings settings = await messaging.requestPermission( alert: true, badge: true, sound: true, ); if (settings.authorizationStatus != AuthorizationStatus.authorized) return; // 获取FCM令牌并上传 String? fcmToken = await messaging.getToken(); if (fcmToken != null) { await FirebaseFirestore.instance.collection("users").doc(userId).update({ "fcmToken": fcmToken }); } // 监听令牌更新 messaging.onTokenRefresh.listen((newToken) { FirebaseFirestore.instance.collection("users").doc(userId).update({ "fcmToken": newToken }); }); }
3. 可选优化点
- 如果你的Twitter API权限支持webhook回调,可以把定时轮询逻辑改成接收Twitter的webhook推送,更新更及时,也不会浪费API请求配额。
- 给用户新增推送自定义开关,允许用户自行选择是否接收更新通知、推送频率,避免用户被频繁打扰。
内容的提问来源于stack exchange,提问作者Vinasirajan Vilakshan
相关产品推荐
相关产品推荐

