Я отправляю уведомление, используя токен устройства с 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, и вы сделаете дополнительный запрос в этой облачной функции, чтобы получить пользовательский документ, а затем получить этот токен
Да, все, что мне нужно, это фрагмент кода для этой части.
Хорошо, вот облачная функция, которая отправит уведомление на все пользовательские устройства при запуске события 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/…
Вы хотите отправить уведомление на все эти токены (устройства), когда произошло определенное событие, используя облачные функции, верно?