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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:36:03