Я придерживаюсь немного другого подхода.У меня есть ионное приложение, и после регистрации приложения в 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);
});
});
Вы можете изменить вышеуказанное в соответствии со своими потребностями.Надеюсь, это поможет