Хранение токенов FCM онлайн - PullRequest
0 голосов
/ 03 декабря 2018

Я работаю с приложением iOS, которое вызывает облачную функцию Firebase, чтобы хранить токены FCM для последующего использования при отправке уведомлений.Проблема в том, что он не работает.

Я использую базу данных Cloud Firestore.

Когда вызывается функция, я хочу, чтобы это произошло.Функция проверяет параметры в базе данных.Если данные в указанном параметре уже найдены в БД, то ничего не должно произойти.Если он не найден, его следует добавить в БД.

Ниже приведен код моей функции облака.Я был бы рад, если бы кто-нибудь мог помочь мне найти точную проблему.

exports.addNewElement = functions.https.onCall((data, context) => {
  console.log('--addNewElement-- has been called with:\n' + data.fcmToken + '\n!!');
  var collectionRef = db.collection("THE_COLLECTION");

  // Create a query against the collection.
  var query = collectionRef.where("fcmToken", "==", data.fcmToken);
  query.get().then(function(doc) {
    if (doc.exists) { // We should do nothing.
        console.log("Document data:", doc.data());
    } else { // We should add the new element.
        // doc.data() will be undefined in this case
        console.log("No such document!");
        collectionRef.add({"fcmToken": fcmToken})
    }
  }).catch(function(error) {
    console.log("Error getting document:", error);
  });
});

Я мог бы представить другие направления работы с токенами FCM.Есть ли какой-нибудь рекомендуемый способ использования в качестве передового опыта?

1 Ответ

0 голосов
/ 03 декабря 2018

Я придерживаюсь немного другого подхода.У меня есть ионное приложение, и после регистрации приложения в FCM (у нас есть токен FCM), я добавляю токен в коллекцию «устройств» прямо из приложения.Таким образом, пользователь может войти в систему более чем на одно устройство, и у нас будет токен для каждого устройства, позволяющий отправлять сообщение на каждое устройство.Если вы хотите отправить сообщение пользователю, вы запрашиваете коллекцию устройств для этого uid, чтобы получить все токены для этого пользователя

Сохранение токена:

    private saveTokenToFirestore(person: Person, token) {
        if (!token) return;
        const devicesRef = this.afs.collection('devices')

        const docData = { 
          token,
          userId: person.id,
        }

        return devicesRef.doc(token).set(docData)
      }

где person.id - это идентификатор firebase.

Затем я использую функции firebase, чтобы отслеживать некоторые узлы, чтобы выяснить, когда отправлять сообщения FCM.

например, у нас есть команды с участниками в качестве членов иони могут общаться друг с другом.Когда человек отправляет сообщение команде, каждый член команды (кроме самого отправителя) должен получить уведомление.

Отправка уведомления всем участникам, кроме самого отправителя:

exports.chatMessageOnCreateSendFcm = functions.firestore
    .document('chatGroups/{teamId}/messages/{messageId}')
    .onCreate(async (snap, context) => {
        const data = snap.data();
        const teamId = context.params.teamId;
        const name = data.pName;
        const message = data.msg;
        const userId = data.pId;

        // Notification content
        const payload = {
            notification: {
                title: name,
                body: message,
            }
        }

        const db = admin.firestore();

        // get the team (chatGroup)
        const teamRef = db.collection('teams').doc(teamId);
        const teamSnapshot = await teamRef.get();
        const team = teamSnapshot.data();
        const devicesRef = db.collection('devices');
        const queries: Promise<FirebaseFirestore.QuerySnapshot>[] = team.members
            .filter(f => f.id !== userId)
            .map(member => {
                return devicesRef.where('userId', '==', member.id).get();
            });

        return Promise.all(queries)
            .then((querySnapshots) => {
                const tokens = [];
                querySnapshots.forEach(snapShot => {
                    if (snapShot) {
                        snapShot.docs.forEach(doc => {
                            if (doc) {
                                const token = doc.data().token;
                                if (token) {
                                    tokens.push(token);
                                }
                            }
                        })
                    }
                });

                if (tokens.length === 0) {
                    return Promise.resolve(null);
                } else {
                    return admin.messaging().sendToDevice(tokens, payload);
                }
            })
            .catch(err => {
                console.error(err);
                return Promise.resolve(null);
            });
    });

Вы можете изменить вышеуказанное в соответствии со своими потребностями.Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...