0

我目前正在使用 AngularJS / Ionic 3 开发一个移动应用程序。

我需要随时跟踪,如果我的用户在某个地理位置的 100m 半径范围内(我们称之为“家庭位置”。我需要随时知道哪个用户在他的家庭位置,谁不在(即使应用程序在后台运行或关闭/终止)。

我想通过使用 Ionic Native Background-Geolocation 插件和cordova-plugin-background-geolocation来实现这一点。我的计划是,每 5 分钟检查一次用户的地理位置并将其与家庭进行比较。

案例1)如果两个位置之间的距离<100m,我知道用户“在家”。然后我会更新我的数据库(Firebase)中的用户节点以将用户标记为isAtHome: true并添加当前时间戳。

案例 2)如果用户不在其家庭位置的 100m 范围内,我会将他标记为isAtHome: false并添加当前时间戳。

即使用户没有移动,我也需要更新我的数据库,因为我需要知道我收到了当前信号。否则,例如,我不知道他是否没有移动或关闭他的智能手机。

如果我想知道我的用户中谁在他家,我会检查isAtHome-attributes,如果它们设置为true,我会检查时间戳以确保我有最新的数据并且数据是写在最后 15 分钟内。

我尝试了许多不同的方法,但我不确定如何使用 Cordova Background Geolocation Plugin 来实现这一点,甚至是否可能。

我的问题是:

是否可以每 5 分钟检查一次用户的地理位置(即使在后台/终止状态)并调用相应更新我的 firebase 数据库的函数?如上所述,即使用户在最后 5 分钟内没有移动,我也需要接收位置。

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

非常感谢您的帮助!

4

1 回答 1

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

于 2017-07-03T17:34:48.873 回答