【问题标题】:Firebase cloud function sending push notifications with geo locationFirebase 云功能发送带有地理位置的推送通知
【发布时间】:2020-10-06 11:15:17
【问题描述】:

我目前有一个连接了 Firebase 实时数据库的 React-Native 应用程序。用户可以选择上传数据并通过推送通知通知附近的用户。用户位置与推送消息的 Firebase 令牌一起保存在数据库中。

创建了一个查找 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 位置不够熟悉,无法使其正常工作。

【问题讨论】:

    标签: react-native firebase-realtime-database google-cloud-functions firebase-cloud-messaging


    【解决方案1】:

    这很有趣。我可以想到以下几点:

    • 创建另一个函数以定期获取所有用户的位置。这可以通过像 geolocationlocation 这样的库来完成,用于 React native。将您的函数设置为每 5 或 10 分钟更新一次用户的位置。

    • 运行原始函数后,您将获得该用户的位置,并添加逻辑以比较附近是否有其他用户进行查询。查询将在最新保存的位置上运行,该位置应该是最近的位置。

    有趣的是这些库的结果是在latitudelongitude上返回的,所以你还需要了解How to calculate distance in miles from longitue and latitude

    希望这有帮助! :)

    【讨论】:

    • 感谢凯文的回复!我目前使用 expo-location,因为我在学习教程时开始使用它(该应用程序现在已被弹出)。一个快速的谷歌搜索告诉我,我也可以为展览位置创建一个后台服务。所以这部分看起来被覆盖了。然后我会覆盖数据库中的新位置。之后,编写用于计算距离的代码开始发挥作用。您链接中的计算还没有意义......必须进一步研究这些;-)
    • 我很高兴听到我们在与第一部分相关的同一频道上:D 是的,我想你可能需要那个链接,因为博览会位置 returns lon lat 作为结果的一部分
    • Kevin 您的 Firebase 云功能知识如何?我正在使用 Geofire 包来实现此功能,但我一直坚持让它正常工作。
    【解决方案2】:

    所以我已经使用 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
        }
    }
    

    使用此功能,用户位置使用用户 ID 和 GPS 位置存储在 de Firebase 数据库中。 在 Firebase 的另一个条目中,我有:

    _FCMTokens __用户身份 ___FCMToken(用于发送推送通知)

    然后我更改了我的云功能,首先使用 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 查询返回选定范围内的每个用户 ID(这是 Firebase 数据库中可用的条目)。在 key_entered 上,使用为每个用户获取 FCMToken 的密钥触发。密钥由 Geofire 提供,在我的例子中是用户 ID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-01
      • 2021-03-08
      • 2019-02-23
      • 2019-12-18
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      相关资源
      最近更新 更多