我目前正在使用AngularJS / Ionic 3开发移动应用程序。
我需要随时跟踪,如果我的用户在某个地理定位的半径100米范围内(让我们称之为“家庭位置”。我需要随时知道哪个用户在他的家乡位置,以及谁不是(即使应用程序在后台运行或已关闭/终止)。
我想通过使用Ionic Native Background-Geolocation插件和cordova-plugin-background-geolocation来实现这一点。我的计划是,每5分钟检查一次用户的地理位置并将其与家庭进行比较。
情况1)如果两个位置之间的距离<1。 100米我知道用户“在家”。然后我会更新我的数据库(Firebase)中的用户节点,将用户标记为isAtHome: true
并添加当前时间戳。
案例2)如果用户不在其家乡位置100米范围内,我会将其标记为isAtHome: false
并添加当前时间戳。
即使用户没有移动,我也需要更新我的数据库,因为我需要知道我收到了当前的信号。否则,我不知道他是不是移动或关闭了他的智能手机,例如。
如果我想知道,我的用户位于他的家乡,我会检查isAtHome
- 属性,如果他们设置为true
,我会检查时间戳以确定我有最新数据,数据是在最近15分钟内写的。
我尝试了很多不同的东西,但我不知道如何用Cordova背景地理定位插件来实现这一点,如果它甚至可能的话。
我的问题是:
是否可以每5分钟检查用户地理位置(即使在后台/终止状态)并调用相应更新我的firebase数据库的功能?如上所述,即使用户在最近5分钟内没有移动,我也需要接收位置。
如果不可能:有人知道如何以另一种方式处理要求吗?
非常感谢你的帮助!
答案 0 :(得分:2)
如cordova-plugin-background-geolocation
所述,您可以配置插件获取位置的时间间隔(以毫秒为单位),请参阅插件github页面中的此示例:
backgroundGeolocation.configure(callbackFn, failureFn, {
desiredAccuracy: 10,
stationaryRadius: 20,
distanceFilter: 30,
url: 'http://192.168.81.15:3000/locations',
httpHeaders: { 'X-FOO': 'bar' },
maxLocations: 1000,
// Android only section
locationProvider: backgroundGeolocation.provider.ANDROID_ACTIVITY_PROVIDER,
interval: 60000, // <-- here
fastestInterval: 5000,
activitiesInterval: 10000,
notificationTitle: 'Background tracking',
notificationText: 'enabled',
notificationIconColor: '#FEDD1E',
notificationIconLarge: 'mappointer_large',
notificationIconSmall: 'mappointer_small'
});
案例是此间隔属性仅适用于Android。我会采用这样的解决方法:
public getLocation: boolean = true; // CREATE A BOOLEAN TO KNOW IF YOU CAN GET LOCATION
backgroundGeolocation.start( // i've never used this plugin, so i'm assuming this is what starts de background watcher
() => {
if(getLocation == true){
this.getLocation = false; // SET TO FALSE SO IT DON'T DO YOUR FUNCTION THE NEXT TIME IT GETS THE LOCATION
// DO YOUR CODE TO SAVE AND CHECK YOUR DATA
// IT'S BETTER IF YOU USE A PROMISE, ASYNC/AWAIT FOR THE SAVING CODE
yourSavingCodeFunction().then(() => {
setTimeout(()=>{
// AFTER 5 MINUTES, SET THE GETLOCATION TO TRUE SO IT CAN DO YOUR FUNCTION AGAIN
this.getLocation = true;
}, 500000);
});
}
},
(error) => {
// Tracking has not started because of error
// you should adjust your app UI for example change switch element to indicate
// that service is not running
}
);
如果您还没有考虑过您的案例1和2,我们也可以解决这个问题。希望这有助于或者可以给你一些想法:D