Вот что у меня есть:
- На Android пользователь входит в систему и вносит изменения в документ Firestore.
- Документ Firestore обновляется
- cloudфункция активирована
- облачная функция отправляет сообщение на устройство (устройства) с использованием токенов устройства
- В Android FirebaseMessagingService должна получать сообщение, но не отправляет его.
Я подозреваючасть, которую я пропускаю, - регистрация токена устройства.Поскольку моим сервером является Firebase, а мои пользователи входят в систему через Firebase, нужно ли предпринимать дополнительные шаги для отправки токена устройства в Firebase, чтобы моя облачная функция могла получить к нему доступ?Другими словами, я сам храню их в Firestore или они входят в стандартную комплектацию некоторой «пользовательской» коллекции, контролируемой Firebase?Для большего контекста я адаптировал свою облачную функцию из примера, который я нашел в Интернете:
ФУНКЦИЯ ОБЛАКА:
exports.coolThingIsHappening = functions.firestore.document("coolstuf/{userId}")
.onWrite(async (change, context) => {
console.log("coolThingIsHappening is triggered");
const userId = context.params.userId;
const after = change.after.data();
const payload = {
data: after
}
const tokensSnapshot = await admin.database()
.ref(`/users/${userId}/notificationTokens`).once('value');
if (!tokensSnapshot.hasChildren()) {
const logMsg = `user ${userId} has no notification tokens.`
console.log(logMsg)
return logMsg;
}
console.log("FCM tokens found")
const tokens = Object.keys(tokensSnapshot.val());
const response = await admin.messaging().sendToDevice(tokens, payload);
const tokensToRemove: Promise<void>[] = [];
console.log(`response results: ${response.results.length}`)
response.results.forEach((result, index) => {
console.log(`fcm sent: ${result.messageId}`)
const error = result.error;
if (error!.code === 'messaging/invalid-registration-token' ||
error!.code === 'messaging/registration-token-not-registered') {
tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
}
});
return Promise.all(tokensToRemove);
});
РЕДАКТИРОВАТЬ
Я продолжилсохранить токены fcm в Firestore.Любая идея, как преобразовать код выше из database
-центрических в firestore
-центрических.У меня проблемы.Код Android:
val data = mapOf("token" to it)
val collectionName = "users/${uid}/deviceTokens/"
FirebaseFirestore.getInstance().collection(collectionName).document()
.set(data)`