Firebase实时聊天应用:用户消息推送通知实现方法咨询
实现Firebase实时聊天消息推送通知的完整方案
嘿,我之前正好搭建过Firebase实时聊天的推送功能,给你一步步拆解具体怎么实现,亲测靠谱:
1. 先搞定FCM的基础配置
首先得确保你的Firebase项目已经启用了Cloud Messaging(FCM):
- 打开Firebase控制台,进入「Cloud Messaging」板块,根据你的平台(安卓/iOS/Web)配置对应的推送凭证:安卓要上传SHA-1和配置
google-services.json;iOS要上传APNs证书;Web端需要生成VAPID密钥。 - 用户登录后,一定要获取他们的FCM令牌(token),并存在Firebase数据库里——比如在
users集合的用户文档下加个fcmTokens数组,用来保存该用户当前所有设备的令牌(毕竟用户可能用多个设备登录)。
2. 用Cloud Function触发实时推送
这是核心步骤,我们要监听消息集合的新增事件,一旦有新消息就自动给接收者发推送:
下面是Node.js版本的示例代码,你可以直接改改适配你的数据结构:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); // 监听聊天消息的新增事件 exports.sendChatNotification = functions.firestore .document("chats/{chatId}/messages/{messageId}") .onCreate(async (snap, context) => { // 获取新消息的数据 const messageData = snap.data(); const recipientId = messageData.recipientId; // 假设你的消息里存了接收者的用户ID const senderId = messageData.senderId; const senderName = messageData.senderName; const messageContent = messageData.content; // 先拿到接收者的FCM令牌 const recipientDoc = await admin.firestore().collection("users").doc(recipientId).get(); if (!recipientDoc.exists) { functions.logger.error("接收者不存在,跳过推送"); return null; } const fcmTokens = recipientDoc.data().fcmTokens; if (!fcmTokens || fcmTokens.length === 0) { functions.logger.error("接收者没有可用的推送令牌,跳过推送"); return null; } // 构建推送内容 const payload = { notification: { title: `${senderName}给你发了消息`, body: messageContent.length > 50 ? `${messageContent.substring(0, 50)}...` : messageContent, clickAction: "FLUTTER_NOTIFICATION_CLICK" // 移动端需要这个字段来处理点击跳转,根据你的框架调整 }, data: { chatId: context.params.chatId, messageId: context.params.messageId, type: "chat_message" // 用来区分不同类型的推送 }, tokens: fcmTokens // 给接收者的所有设备发推送 }; // 发送推送并处理结果 try { const response = await admin.messaging().sendMulticast(payload); functions.logger.log(`推送发送完成:成功${response.successCount}条,失败${response.failureCount}条`); // 自动清理无效的令牌(比如用户卸载了APP) const invalidTokens = []; response.responses.forEach((resp, idx) => { if (!resp.success) { invalidTokens.push(fcmTokens[idx]); } }); if (invalidTokens.length > 0) { await admin.firestore().collection("users").doc(recipientId).update({ fcmTokens: admin.firestore.FieldValue.arrayRemove(...invalidTokens) }); } return null; } catch (error) { functions.logger.error("推送发送失败", error); return null; } });
3. 客户端配合处理
- 移动端(安卓/iOS):集成FCM SDK,登录成功后获取令牌并上传到
users集合的对应文档里;还要处理通知的点击事件,比如点击后直接跳转到对应的聊天窗口。 - Web端:用Firebase Messaging SDK初始化,获取VAPID令牌并上传;监听推送事件,在浏览器弹出通知,点击后跳转到聊天页面。
4. 一些实用的注意事项
- 权限问题:部署Cloud Function时,确保它有访问Firestore和发送FCM消息的权限,直接用
firebase deploy --only functions部署就行,Firebase会自动配置基础权限。 - 避免打扰:如果用户当前在线(可以在客户端给用户文档加个
isOnline字段标记),可以在Cloud Function里判断,在线的话就不发推送。 - 本地化适配:如果需要多语言,可以在推送时根据用户的语言设置动态生成标题和内容。
内容的提问来源于stack exchange,提问作者Maicon Luiz Anschau
相关产品推荐
相关产品推荐

