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

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移动端应用的同事即便已生成推送令牌,仍无法收到推送通知。我有两个问题:

  1. 现有代码是否适用于React Native应用?是否需要稍作调整才能生效?
  2. 是否需要在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:57:21