Как реализовать функцию, которая запускает push-уведомление при создании нового документа на fcm? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть университетский проект, в котором я разрабатываю приложение, которое должно получать push-уведомление при создании нового документа в коллекции 'ocorrencia' из firebase.

Я пытался выполнить эту облачную функцию Firebase, но без удачи она не работает, и я не знаю, как мне прочитать токен свойства (мое приложение отправляет фактический токен устройства) от каждого пользователя в коллекции 'admin' и добавьте его в массив для отправки на все устройства с этим значением.

Я также пытался использовать этот учебник, но он тоже не работал: 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' с маркером свойства.

EDIT: Я пробовал этот код, но не знаю, как мне восстановить все документы по их идентификатору

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 голосов
/ 04 июня 2019

Решил проблему сам, перейдя от токена к теме:

Вот код, если кто-то хочет реализовать:

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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...