Я отправляю уведомление, используя токен устройства с Cloud Firestore и Cloud Function. Теперь система будет хранить токен устройства, на котором пользователь входит в систему. Поскольку у пользователя может быть несколько устройств или он может входить в систему с другого устройства, все, что я хочу, - это отправить это уведомление на это устройство, используя сохраненный токен устройства. Так выглядит пользовательский документ, я храню токены как вложенный объект.
{
name: "Frank Kemerut",
device_tokens: { 23qweq: "LG G6", Os23pk: "Samsung S6", asd231: "Samsung S9" },
age: 12
}
Теперь я хочу выполнить итерацию и получить все ключи и значения, а затем отправить уведомление на это устройство, используя собранные токены. Как я собираюсь это сделать? Это лучший подход?
@ AhmedAbd-Elmeged да
Хорошо, я отвечу на него, используя Typescript, при условии, что его триггер firestore будет работать с вами?
Я использую Javascript, это что-то другое?
Не очень маленькая разница, вы можете легко ее преобразовать
Хорошо, позволь мне попробовать
Когда вы отправляете уведомление после триггера, у вас будет идентификатор пользователя или что-то еще для доступа к этим токенам, верно?
Да, я уже могу получить другие поля, кроме этого вложенного объекта.
Круто, поэтому я предполагаю, что вы каким-то образом получите userId, и вы сделаете дополнительный запрос в этой облачной функции, чтобы получить пользовательский документ, а затем получить этот токен
Да, все, что мне нужно, это фрагмент кода для этой части.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хорошо, вот облачная функция, которая отправит уведомление на все пользовательские устройства при запуске события firestore. Предполагая, что у вас есть идентификатор пользователя в этом триггере из объекта события или другим способом. Функция будет использовать этот идентификатор для получения пользовательского документа из базы данных в зависимости от того, как вы его сохранили, затем получит токен уведомления и отправит его на все его устройства на карте device_tokens.
export const sendEventNotification = functions.firestore.document('events/${eventId}')
.onCreate((data, context) => {
const userId = "someId"
//Get the user document to get the notification tokens.
return firestore.doc(`users/${userId}`).get().then((user) => {
//dummy notification payload
const payload = {
data: {
event: JSON.stringify(data.data())
}
}
//The device tokens mapped to device name.
const device_tokens = user.data().device_tokens
//Array of notification tokens that we will send a notification to.
const promises = []
Object.keys(device_tokens).forEach(token => {
promises.push(admin.messaging().sendToDevice(token, payload))
})
return Promise.all(promises)
}).catch((error) => {
console.info(`Failed to send user notification. Error: ${error}`)
return null
})
})
Могу ли я напрямую поместить обмен сообщениями администратора в цикл foreach, не выполняя обещаний?
Нет, вам нужно добавлять обещания, потому что это асинхронная функция
Хорошо, спасибо, я попробую сейчас, и если это сработает, я немедленно приму этот ответ.
Что делать, если device_tokens пуст, как я с этим справлюсь?
Да, вы должны проверить, не пустой ли ключ, прежде чем вызывать обещание.push Я забыл добавить его. И примите вопрос, сработает ли решение у вас :)
Он работает нормально, спасибо, теперь у меня новый вопрос stackoverflow.com/questions/53130011/…
Вы хотите отправить уведомление на все эти токены (устройства), когда произошло определенное событие, используя облачные функции, верно?