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

使用Firebase Cloud Messaging实现安卓端定时推送通知相关问题咨询

PowerShell curl测试报错修复

你遇到的报错由两个核心问题导致:

  1. PowerShell对单引号包裹的JSON解析逻辑特殊,会把JSON内空格分隔的内容识别为独立主机参数,末尾多余的HTTP/1.1也被误判为独立请求地址
  2. FCM v1接口不支持直接传递APP服务器密钥作为认证凭证,必须使用OAuth2访问令牌,你用错了认证方式

推荐用更简单的FCM legacy接口完成测试,PowerShell下可用的命令如下,注意替换里面的服务器密钥(可在Firebase控制台-项目设置-云消息传递里找到):

curl -X POST -H "Authorization: key=你的FCM服务器密钥" -H "Content-Type: application/json" -d '{
  \"to\": \"/topics/notifications\",
  \"notification\": {
    \"title\": \"FCM测试消息\",
    \"body\": \"这是一条主题推送测试\"
  }
}' https://fcm.googleapis.com/fcm/send

6小时定时推送实现(TypeScript云函数)

前置准备

安装Firebase CLI,登录你的Firebase账号后初始化云函数项目,选择TypeScript语言。注意定时云函数需要升级到Blaze套餐才能运行,套餐包含免费额度,普通小流量使用不会产生费用。

云函数代码

替换项目中src/index.ts的内容如下,提供两种实现方案可按需选择:

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
admin.initializeApp();

// 每6小时触发一次的定时推送任务
export const sendScheduledNotification = functions.pubsub.schedule("every 6 hours")
  // 替换为你所在的时区,中国大陆地区可设置为Asia/Shanghai
  .timeZone("Asia/Shanghai")
  .onRun(async (context) => {
    // 方案1:主题推送(无需遍历用户,推荐)
    // 安卓端用户同意订阅时调用subscribeToTopic("notifications")即可自动接收推送
    const topicMessage = {
      notification: {
        title: "定时提醒",
        body: "你订阅的6小时定时通知已送达"
      },
      topic: "notifications"
    };
    try {
      const res = await admin.messaging().send(topicMessage);
      console.log("主题推送成功:", res);
      return null;
    } catch (err) {
      console.error("主题推送失败:", err);
      return null;
    }

    // 方案2:按用户订阅字段筛选推送(不需要主题)
    // 自动拉取Firestore中isSubscribed字段为true的用户,给对应设备发推送
    /*
    try {
      const userSnaps = await admin.firestore().collection("users").where("isSubscribed", "==", true).get();
      const tokenList: string[] = [];
      userSnaps.forEach(doc => {
        const user = doc.data();
        if (user.fcmToken) tokenList.push(user.fcmToken);
      });
      if (tokenList.length === 0) {
        console.log("无需要推送的用户");
        return null;
      }
      const multicastMsg = {
        notification: {
          title: "定时提醒",
          body: "你订阅的6小时定时通知已送达"
        },
        tokens: tokenList
      };
      const res = await admin.messaging().sendEachForMulticast(multicastMsg);
      console.log(`推送完成:成功${res.successCount}条,失败${res.failureCount}条`);
      return null;
    } catch (err) {
      console.error("推送流程出错:", err);
      return null;
    }
    */
  });

安卓端适配(主题方案)

如果选用方案1的主题推送,在用户点击订阅开关时添加对应逻辑即可:

// 用户同意订阅时调用
FirebaseMessaging.getInstance().subscribeToTopic("notifications")
  .addOnCompleteListener(task -> {
    if (task.isSuccessful()) {
      // 订阅成功,更新Firestore中当前用户的订阅状态为true
    }
  });

// 用户取消订阅时调用
FirebaseMessaging.getInstance().unsubscribeFromTopic("notifications")
  .addOnCompleteListener(task -> {
    if (task.isSuccessful()) {
      // 退订成功,更新Firestore中当前用户的订阅状态为false
    }
  });

部署方法

在云函数项目根目录下执行命令即可完成部署:

firebase deploy --only functions

内容的提问来源于stack exchange,提问作者nmnsharma007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:27:03