背景地理位置插件:每5分钟跟踪位置和更新数据库

时间:2017-07-03 16:04:37

标签: angularjs ionic2 cordova-plugins ionic-native

我目前正在使用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分钟内没有移动,我也需要接收位置。

如果不可能:有人知道如何以另一种方式处理要求吗?

非常感谢你的帮助!

1 个答案:

答案 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