Web 应用程序中未收到 Firebase 云消息传递通知

Posted

技术标签:

【中文标题】Web 应用程序中未收到 Firebase 云消息传递通知【英文标题】:Firebase Cloud Messaging Notification not received in web app 【发布时间】:2020-11-07 07:35:56 【问题描述】:

我正在使用 FCM 进行通知。 FCM 在从 Firebase 数据库创建数据时触发。我收到了第一条消息。之后,就没有收到其他连续的消息了。我在本地环境中运行它。问题是由于以下消息“未配置计费帐户。无法访问外部网络并且配额受到严重限制。配置计费帐户以消除这些限制”或任何其他问题。我是否需要进入接收消息的计费计划。在测试环境中工作,这就是不转向计费计划的原因。如果问题与计费计划无关,有人可以指出代码的任何其他问题。

Firebase 功能日志

6:22:52.133 PM
sendFollowerNotification
Function execution started
6:22:52.133 PM
sendFollowerNotification
Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictions
6:22:52.143 PM
sendFollowerNotification
Function execution took 10 ms, finished with status: 'ok'
6:22:52.401 PM
sendFollowerNotification
1 messages were sent successfully

节点js代码

exports.sendFollowerNotification = functions.database.ref('/notification/message/gId/pId')
        .onCreate(async (change, context) => 
    
          //console.log('Group id:', context.params.gId," Push ID:",context.params.pId, "Change",change);
          
          const notificationData =  change.val();
          var topic = notificationData.topic;
          var title = notificationData.title;
          var body = notificationData.body;
          var registrationTokens = notificationData.tokens;
    
          const message = 
            notification: 
              title: title,
              body: body
            ,
            tokens: registrationTokens,
          ;
    
          admin.messaging().sendMulticast(message)
          .then((response) => 
            // Response is a message ID string.
            console.log(response.successCount + ' messages were sent successfully');
          )
          .catch((error) => 
            console.log('Error sending message:', error);
          );
          
        );

【问题讨论】:

【参考方案1】:

该消息并不表示错误。这只是一个警告,让您知道如果您的项目不在付款计划中,出站网络将不起作用。 FCM 消息不属于这一类 - 它应该可以工作。

问题是您的代码没有返回在所有异步工作完成后解决的承诺。现在,它什么也不返回,并且函数在消息发送之前立即终止。请阅读并了解documentation关于此的内容。

至少,您需要返回承诺链,让 Cloud Functions 知道消息何时发送,并且可以安全地终止。

          return admin.messaging().sendMulticast(message)
          .then((response) => 
            // Response is a message ID string.
            console.log(response.successCount + ' messages were sent successfully');
          )
          .catch((error) => 
            console.log('Error sending message:', error);
          );

注意上面的 return 关键字。

如果消息仍然没有被发送,那么这里还有一些我们看不到的问题。您可能没有正确处理您的设备令牌。

【讨论】:

非常感谢,很抱歉延迟回复您。它工作得很好。【参考方案2】:

我想这可能会回答你的问题:Why will I need a billing account to use Node.js 10 or later for Cloud Functions for Firebase?:

由于计划于 2020 年 8 月 17 日更新其底层架构,Cloud Functions for Firebase 将依赖一些额外的 Google 付费服务:Cloud Build、Container Registry 和 Cloud Storage。这些架构更新将适用于部署到 Node.js 10 运行时的功能。除了现有定价之外,还将对这些服务的使用收费。

在新架构中,Cloud Build 支持功能部署。您只需为构建函数的运行时容器所需的计算时间付费。

另一方面,Firebase Clud Messaging 服务本身是免费的:

Firebase 云消息传递 (FCM) 在您的服务器和设备之间提供可靠且省电的连接,让您可以在 iosandroid 和网络上免费发送和接收消息和通知。

鉴于您在 CF 中使用 Node,平台需要您一个结算帐户。

【讨论】:

这实际上根本不是问题。如果是,那么就会出现实际错误,而不仅仅是警告。 看来账单警告并不是没有收到通知的真正原因。无论如何感谢您的回复。

以上是关于Web 应用程序中未收到 Firebase 云消息传递通知的主要内容,如果未能解决你的问题,请参考以下文章

IOS 应用程序中未收到 Firebase 推送通知徽章计数

Firebase 云消息/通知未收到。 JS

iOS 未收到来自 Firebase 云消息传递的通知

Firebase 云消息传递消息日志

Flutter - Firebase 云消息传递,iOS 上未收到数据消息

使用.p8文件后未收到iOS Firebase云消息传递通知