Firebase 函数的推送通知 - 迭代 onWrite 返回

Posted

技术标签:

【中文标题】Firebase 函数的推送通知 - 迭代 onWrite 返回【英文标题】:Push notification on Firebase Functions - Iterate onWrite returns 【发布时间】:2020-10-06 22:04:44 【问题描述】:

所以我尝试使用 Firebase 函数和 FCM 向用户发送推送通知。我参考了示例代码来填充我的推送,当我使用硬编码令牌时,它可以正常工作并且推送会正确发送。以下是我的工作云功能代码。

'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.sendChatNotification = functions.database.ref('/user_pushes/uid').onWrite((change, context) => 

const afterData = change.after.val();
//let tokens = "My_hardcoded_device_token"
console.log('tokens',afterData.fcm_tokens)
let tokens = afterData.fcm_tokens

const payload = 
notification: 
title: afterData.sender_name,
body: afterData.message,
sound: "default"

;
return admin.messaging().sendToDevice(tokens, payload);
);

下面是我的 '/user_pushes/uid' 的 RTDB 的 json。

 fcm_tokens: 
   'token1': 0, 
    'token2': 0, 
    'token3': 0, , 
  message: '????????', 
  sender_name: 'sender name'
 

我当然想从我的数据库中获取令牌。我希望在循环中使用 like for 从名为“fcm_tokens”的节点获取我的令牌,但还没有找到合适的 sn-p 的运气。我希望我的令牌采用一种数组形式,以便可以将推送发送到多个接收器。我是一个没有经验的自学 ios 开发人员,还没有学习过服务器端编程,所以如果我的方法不合适,请多多指教!非常感谢!

###编辑###

我尝试使用下面的一行代码检索令牌,但它抛出另一个错误,指出令牌不应该是空字符串或数组,尽管它可能不是空的。也许我的令牌是键而不是值,这就是原因?如果是这种情况,任何人都可以建议如何将键放入数组中?

let tokens = afterData.fcm_tokens
console.log('tokens',afterData.fcm_tokens)
tokens  'fWgm79ifOUVSofW2XXhoKt:APA91bHovn04k5lwnkzfQD74VmekV8FoTSUh8pyr9d_I0EMDPuzFdKpD7Y4OU_AKHVjalGQaGE_I6A5m6livf8QrxHTSTmn9h6EB9qyBde_reQRcjU6cZLHLLXx2cO0w6f3MOZOFnYDv': 0  
Error: Registration token(s) provided to sendToDevice() must be a non-empty string or a non-empty array.
    at FirebaseMessagingError.FirebaseError [as constructor] (/srv/node_modules/firebase-admin/lib/utils/error.js:42:28)
    at FirebaseMessagingError.PrefixedFirebaseError [as constructor] (/srv/node_modules/firebase-admin/lib/utils/error.js:88:28)
    at new FirebaseMessagingError (/srv/node_modules/firebase-admin/lib/utils/error.js:254:16)
    at Messaging.validateRegistrationTokensType (/srv/node_modules/firebase-admin/lib/messaging/messaging.js:729:19)
    at Messaging.sendToDevice (/srv/node_modules/firebase-admin/lib/messaging/messaging.js:328:14)
    at exports.sendChatNotification.functions.database.ref.onWrite (/srv/index.js:27:26)
    at cloudFunction (/srv/node_modules/firebase-functions/lib/cloud-functions.js:134:23)
    at /worker/worker.js:825:24
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7) 

【问题讨论】:

【参考方案1】:

经过几次变通办法后,我终于成功了。事实证明这很简单。只需使用 forEach 语法捕获键即可遍历 json。

const tokens = Object.keys(afterData.fcm_tokens)

更多详情,请看下文。

Error with registration token in FCM with Cloud Functions

【讨论】:

如果您需要值而不是键,那么 const tokens = Object.values(afterData.fcm_tokens) 将完成这项工作。

以上是关于Firebase 函数的推送通知 - 迭代 onWrite 返回的主要内容,如果未能解决你的问题,请参考以下文章

通过 Firebase 函数发送的 Swift 中的加密推送通知

每次在 firebase 实时数据库中添加新孩子时使用 firebase 函数发送推送通知不起作用

Firebase 函数无法使用异步 sendMulticast 方法发送一些推送通知

我正在使用 firebase 进行推送通知。并且我的“didReceiveRemoteNotification”函数没有被调用

Firebase - 推送通知 - 没有按预期工作

如何翻译 Firebase 推送通知?