Node.js(Nest.js)服务器向React Native应用推送Firebase通知问题咨询
问题描述
我有一个Node.js + Nest.js服务器,通过Firebase Cloud Messaging(FCM)向所有持有推送令牌(push-token)的设备推送通知,实现代码如下:
async notifyAll(message: INotification) { const documentsAll = await this.repository.find({ query: {}, skip: 0, limit: 0, sort: undefined, }); const tokens = documentsAll.map((item) => { if (item.token) return item.token; }); const chunks = _.chunk(tokens, 100); try { for (const chunk of chunks) { await this.admin.messaging().sendMulticast({notification: message, tokens: chunk}); return 'Notification sent successfully'; } } catch (error) { return `Error sending notification:, ${error}`; } }
该代码在Chrome、Firefox等浏览器中运行正常,但React Native移动端应用的同事即便已生成推送令牌,仍无法收到推送通知。我有两个问题:
- 现有代码是否适用于React Native应用?是否需要稍作调整才能生效?
- 是否需要在Firebase中新建一个移动项目来连接我的服务器与他的应用?
解答
1. 现有代码对React Native的适配调整
现有代码不完全适配React Native,需要做以下关键调整:
- 过滤无效令牌:当前
map操作会保留undefined值(当item.token为空时),这些无效令牌会导致FCM批量发送失败。应改为:const tokens = documentsAll.map(item => item.token).filter(Boolean); - 修复循环提前返回问题:原代码在第一个chunk发送完成后就直接
return,后续chunk对应的设备根本收不到通知。需将返回语句移到循环外:try { for (const chunk of chunks) { await this.admin.messaging().sendMulticast({notification: message, tokens: chunk}); } return 'Notification sent successfully'; } catch (error) { return `Error sending notification:, ${error}`; } - 补充消息格式:React Native的FCM客户端在应用后台杀死状态下,仅靠
notification字段可能无法触发通知展示。建议同步添加data字段,或配置平台专用参数:await this.admin.messaging().sendMulticast({ notification: message, data: { ...message }, // 将通知内容同步到data字段,确保离线可接收 tokens: chunk });
2. Firebase项目的配置要求
不需要新建Firebase项目,但需确保以下配置一致:
- React Native端的
google-services.json(Android)或GoogleService-Info.plist(iOS)必须从服务器所用的同一个Firebase项目下载。 - 检查Firebase项目中是否启用了Android和iOS的推送服务:Android需配置SHA-1证书指纹,iOS需上传APNs密钥并开启推送权限。
- 确认React Native端生成的推送令牌是基于当前Firebase项目配置生成的,FCM令牌与项目绑定,跨项目令牌无法接收推送。
内容的提问来源于stack exchange,提问作者Adil Kashiev
相关产品推荐
相关产品推荐

