在fcm上创建新文档时,如何实现触发推送通知的功能?

时间:2019-06-03 15:23:51

标签: node.js google-cloud-firestore firebase-cloud-messaging google-cloud-functions ionic4

我有一个大学项目,我正在开发一个应用,当在Firebase集合“ ocorrencia”上创建新文档时,该应用需要接收推送通知。

我已经尝试过执行此Firebase云功能,但是没有运气,它不起作用,我不知道如何从“管理员”集合中的每个用户读取属性令牌(我的应用程序发送实际的设备令牌)并将其添加到一个数组中,以将该值发送到所有设备。

我也尝试过使用本教程,但是也没有用: https://angularfirebase.com/lessons/ionic-native-with-firebase-fcm-push-notifications-ios-android/

这是我的index.js函数:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.notificacao = functions.firestore
    .document('ocorrencia/{ocorrenciaId}')
    .onCreate((snap,context) => {

        const data = snap.data();
        const idAdmin = data.idAdmin

        const payload = {
            notification: {
                title:'Nova Ocorrência',
                body:'Uma nova Ocorrência foi registrada'
            }
        }
        var pushToken = "";
        return functions
        .firestore
          .collection("admin/idAdmin")
          .get()
          .then((doc) => {
            pushToken = doc.data().token;
            return admin.messaging().sendTodevice(pushToken, payload)
          });
    })

这是我的应用程序函数,用于将令牌发送到服务器(在用户登录后触发):

async getDeviceToken(){
    let token;
    token = await this.fcm.getToken();
    console.log(this.adminUid);
    return this.sendFirestoreToken(token);
  }

  getAdminUid(){
    this.afAuth.authState.subscribe(auth => {
      this.adminUid = auth.uid;
    })
  }

  sendFirestoreToken(token){
    const adminRef = this.afs.collection('admin')
    return adminRef.doc(this.adminUid).update({idAdmin: this.adminUid, token: token});
  }

在github上还有我的应用程序仓库: https://github.com/gianveloxbr/MacacoIrmaoADM/tree/master/macacoIrmao

该功能需要在每次将新注册表添加到“ ocorrencia”时触发,并且需要将其发送到具有属性令牌的“ admin”集合中的每个用户。

编辑: 我已经尝试过此代码,但不知道如何通过其ID恢复所有文档

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.notificacao = functions.firestore
    .document('ocorrencia/{ocorrenciaId}')
    .onCreate((snap,context) => {

        const data = snap.data();
        const idAdmin = data.context.idAdmin


          const db = admin.firestore()

          // send a notification to each device token

          return Promise.all([admin.database().ref('admin/${}/token').once('value')]).then(
           // Don't know how to get every document using ${}
   results => {
                  const token = results[1];
                  if(!token.hasChildren()) return null;
                  let payload = {
                    notification: {
                        title:'Nova Ocorrência',
                        body:'Uma nova Ocorrência foi registrada'
                    }
                }
                const tokens = Object.keys(token.val());
                return admin.messaging().sendToDevice(tokens,payload);
              }
          )
    })

1 个答案:

答案 0 :(得分:0)

通过将令牌从主题更改为主题来自己解决问题:

以下是任何人想要实现的代码:

index.js

exports.notificacao = functions.firestore
.document('ocorrencia/{ocorrenciaId}')
.onCreate((snap,context) => {
 let payload = {
      notification: {
          title: 'Nova ocorrência',
          body: 'Uma nova ocorrência foi registrada.',
          click_action: 'FCM_PLUGIN_ACTIVITY'
      }
  }
      return admin.messaging().sendToTopic("admin",payload).then(response => {
          console.log('Notificação enviada com sucesso.', response);
      }).catch(error => {
          console.log('Erro:', error);
      })
    }
)

要在用户登录后订阅主题,您需要在app.component.ts上实现该主题

import { FCM } from '@ionic-native/fcm/ngx';
constructor(private fcm:FCM) { }
this.fcm.subscribeToTopic('admin');