Flutter 应用程序的 Firebase 通知突然停止

Posted

技术标签:

【中文标题】Flutter 应用程序的 Firebase 通知突然停止【英文标题】:Firebase notification for Flutter application suddenly stopped 【发布时间】:2021-02-09 10:34:43 【问题描述】:

我正在尝试将 FCM 集成到我的颤振应用程序中。我已经完成了 androidios 的所有连接设置。当我借助云消息测试通知功能发送通知时,设备会正确接收通知。

我编写了一个函数脚本,它会在给定时间自动发送通知。当我大约 2 周前部署该功能时,它几乎按预期工作。 大部分客户都收到了应有的通知。但是,过去几天通知已完全停止到达客户端。

我在 firebase 控制台中的功能日志显示通知已发送,但报告显示我的用户没有收到通知。

我确定我编写有效载荷的方式有问题。

这是我的代码

exports.sendFollowerNotification = functions.database.ref('/notifications/notificationID')
.onCreate(async (snapshot, context) => 
  const notificationID = context.params.notificationID;
  const notificationData = snapshot.val();

  const getDeviceTokensPromise = admin.database()
    .ref('/DeviceTokens').orderByChild("subscribed").equalTo("1").once('value');


  //list all tokens in a array
  let tokensSnapshot;
  let tokens;

  const results = await Promise.all([getDeviceTokensPromise]);
  tokensSnapshot = results[0];
  if (!tokensSnapshot.hasChildren()) 
    return console.log('There are no notification tokens to send to.');
  
  console.log('There are', tokensSnapshot.numChildren(), 'tokens to send notifications to.');

  tokens = Object.keys(tokensSnapshot.val());

  const payload = 
    notification: 
      body: notificationData.body,
      title: notificationData.title,
      click_action: 'FLUTTER_NOTIFICATION_CLICK'
    ,
    data: 
      id: '1', 
      status: 'done'
    ,
  ;

  //loop through each element in the /DeviceTokens node and get data for each entry with the 
 getTheTokens function.
  for (var tokenDetails in tokens) 
    getTheTokens(tokens[tokenDetails]);
  

 //getTheTokens function
 function getTheTokens() 
    var refKey = admin.database().ref('/DeviceTokens').child(tokens[tokenDetails]);
    refKey.once('value', (snapshot) => 
      var theToken = snapshot.child('/device_token').val();
      try 
        const response = admin.messaging().sendToDevice(theToken, payload);

       // gives proper feedback to console.
       console.log('Notification sent successfully');
       catch (err) 
        console.log(err);
      
    );
 
);

我正在使用实时数据库,其中针对连接到系统的任何设备保存设备令牌。我有一个名为 DeviceTokens 的文档。我有另一个文档 notifications 存储通知。 当通知中生成条目时,该函数应该识别该条目,然后循环遍历所有设备令牌并将该通知发送到订阅该通知的所有设备。

我的 firebase 控制台日志打印 通知已成功发送,以显示 DeviceTokens 中存在的设备令牌数量。但是函数执行后会报错。

 sendFollowerNotification
 Error: Error while making request: Client network socket disconnected before secure TLS connection was established. 
 Error code: ECONNRESET at FirebaseAppError.FirebaseError [as constructor (/workspace/node_modules/firebase-admin/lib/utils/error.js:42:28) 
 at FirebaseAppError.PrefixedFirebaseError [as constructor] (/workspace/node_modules/firebase-admin/lib/utils/error.js:88:28) 
 at new FirebaseAppError (/workspace/node_modules/firebase-admin/lib/utils/error.js:123:28)
 at /workspace/node_modules/firebase-admin/lib/utils/api-request.js:209:19 
 at process._tickCallback (internal/process/next_tick.js:68:7) 

sendFollowerNotification
Error: Process exited with code 16
at process.on.code (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js:271:38)
at process.emit (events.js:198:13)
at process.EventEmitter.emit (domain.js:448:20)
at process.exit (internal/process/per_thread.js:168:15)
at Object.logAndSendError (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/logger.js:37:9)
at process.on.err (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js:268:22)
at process.emit (events.js:198:13)
at process.EventEmitter.emit (domain.js:448:20)
at emitPromiseRejectionWarnings (internal/process/promises.js:140:18)
at process._tickCallback (internal/process/next_tick.js:69:34) 

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

小提示:

如果它对您的情况有所帮助,请查看 Firebase 存储库以了解如何处理通知 https://github.com/firebase/functions-samples/blob/master/fcm-notifications/functions/index.js

【讨论】:

找不到这与我写的代码有任何显着差异。【参考方案2】:

尝试检查您的规则,也许它们已过期。 如果这也很好,我认为问题可能是新更新,现在您必须在执行任何操作之前初始化 Firebase 应用程序。 您必须将 firebase 核心添加到 pubsec 文件,然后在任何 firebase 操作之前导入 firebase 核心并通过

await Firebase.initializeApp();

也许这会奏效。

【讨论】:

我在上述函数文件const functions = require('firebase-functions');const admin = require('firebase-admin');const ref = require('firebase-functions/lib/providers/database');admin.initializeApp();中有以下导入

以上是关于Flutter 应用程序的 Firebase 通知突然停止的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 应用程序的 Firebase 通知突然停止

Flutter Firebase 消息传递 - 应用打开时未显示推送通知

Flutter Firebase 通知消息传递

如果应用程序未启动,Flutter Firebase 推送通知无法数据

Flutter firebase消息传递未收到通知

使用flutter firebase的应用程序内部通知