Firebase 云功能发送带有地理位置的推送通知



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

将创建一个云函数来查找 pushUsed 值。如果这是真的,它将收集令牌并发送消息。现在它向每个用户发送一条消息,我可以重写云函数以检查用户是否在附近吗?

这是创建令牌数组的部分。我希望做类似的事情; 如果用户坐标在 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 本机位置等库来完成。将函数设置为每 5 或 10 分钟更新一次用户的位置。

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

有趣的是,这些库的结果是按纬度和经度返回的,因此您还需要了解如何计算与纵向和纬度的距离(以英里为单位(。

希望对您有所帮助! :)

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

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

_FCMTokens __UserID ___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提供,在我的例子中是userID。

最新更新