Итак, я получил уведомления о географическом местоположении, работающие с использованием geofire- js!
saveLocationHandler = async() => {
let uid = await AsyncStorage.getItem("ta:auth:userId");
let userLocationAsync = await AsyncStorage.getItem("ta:auth:userLocation");
const transformedData = JSON.parse(userLocationAsync);
const { userLocation } = transformedData;
const firebaseRef = Firebase.database().ref('Geolocations')
const geoFire = new GeoFire(firebaseRef)
const ref = geoFire.ref()
if (uid || userLocation) {
geoFire.set(uid, [userLocation.lat, userLocation.lng]);
}
else {
console.log('GeoFire UserID en/of userLocation are not known')
return
}
}
Благодаря этой функции местоположение пользователя сохраняется в базе данных Firebase с использованием идентификатора пользователя и местоположения GPS. В другой записи Firebase у меня есть:
_FCMTokens __UserID ___FCMToken (для отправки уведомлений pu sh)
Затем я изменил свою облачную функцию, чтобы сначала проверить, какие пользователи приближаются к использованию Geofire.
const tokenArray = []
const geofireQuery = new GeoFire(admin.database().ref('Geolocations')).query({
center: [event._data.location[0].lat, event._data.location[0].lng],
radius: event._data.selectedRange
})
.on('key_entered', async (key) => {
// Geofire only provides an index to query.
// We'll need to fetch the original object as well
const getDeviceTokensPromise = await admin.database()
.ref('/UserFCMToken/'+ key ).once('value', (snapShot) => {
snapShot.forEach((childSnapshot) => {
tokenArray.push(childSnapshot.val().FCMToken)
})
})
});
const response = await admin.messaging().sendToDevice(tokenArray, payload);
Запрос Geofire возвращает каждый идентификатор пользователя, который находится в пределах selectedRange (это запись, доступная в базе данных Firebase). На key_entered, который запускается с ключом, извлекается FCMToken для каждого пользователя. Ключ предоставляется Geofire, в моем случае это userID.