Облачная функция Firebase, отправляющая уведомления pu sh с географическим местоположением - PullRequest
0 голосов
/ 16 июня 2020

В настоящее время у меня есть приложение React-Native с подключенной базой данных в реальном времени firebase. Пользователи могут выбрать загрузку данных и уведомить ближайших пользователей уведомлением pu sh. Местоположение пользователей сохраняется в базе данных вместе с токеном Firebase для сообщений pu sh.

Создается облачная функция, которая будет искать значение pushUsed. Если это правда, он соберет жетоны и отправит сообщение. На данный момент он отправляет сообщение каждому пользователю, могу ли я переписать облачную функцию, чтобы проверять, находится ли пользователь рядом?

Это та часть, где создается tokenArray. Я надеялся сделать что-то вроде; если координаты пользователя находятся в диапазоне xx миль, добавьте токен в массив. Остальное игнорировать.

const tokenArray = []

  const getDeviceTokensPromise = await admin.database()
  .ref("/UserFCMToken/").once('value', (snapShot) => {

          snapShot.forEach((childSnapshot) => {
            tokenArray.push(childSnapshot.val().FCMToken)
          })
        });

        console.log(tokenArray)
      const response = await admin.messaging().sendToDevice(tokenArray, payload);

Кто-нибудь может мне с этим помочь? Я недостаточно знаком с местоположением GPS, чтобы это работало.

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Итак, я получил уведомления о географическом местоположении, работающие с использованием 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.

0 голосов
/ 17 июня 2020

Это довольно интересно. Я могу думать о следующем:

  • Создайте другую функцию для периодического получения местоположения всех ваших пользователей. Это можно сделать с помощью таких библиотек, как geolocation или location для React native. Настройте функцию для обновления местоположения пользователей каждые 5 или 10 минут.

  • После запуска исходной функции вы получаете местоположение этого пользователя и просто добавляете logi c для сравнения если рядом находится другой пользователь с запросом. Запрос будет выполняться в самом последнем сохраненном месте, которое должно быть самым последним.

Интересно то, что результаты этих библиотек возвращаются на широте и долгота , поэтому вам также необходимо понимать Как рассчитать расстояние в милях от долготы и широты .

Надеюсь, это будет полезно! :)

...