使用Firebase Cloud Messaging实现安卓端定时推送通知相关问题咨询
PowerShell curl测试报错修复
你遇到的报错由两个核心问题导致:
- PowerShell对单引号包裹的JSON解析逻辑特殊,会把JSON内空格分隔的内容识别为独立主机参数,末尾多余的
HTTP/1.1也被误判为独立请求地址 - 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
相关产品推荐
相关产品推荐

