【问题标题】:Background Geolocation Plugin: Track location and update database every 5 minutes后台地理定位插件:每 5 分钟跟踪位置并更新数据库
【发布时间】:2017-12-06 23:31:37
【问题描述】:

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

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

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

案例1)如果两个位置之间的距离isAtHome: true 并添加当前时间戳。

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

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

如果我想知道我的用户中有哪些人在他的家中,我会检查isAtHome-attributes,如果它们设置为true,我会检查时间戳以确保我有-to-date 数据,并且数据是在过去 15 分钟内写入的。

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

我的问题是:

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

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

非常感谢您的帮助!

【问题讨论】:

    标签: angularjs ionic2 cordova-plugins ionic-native


    【解决方案1】:

    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

    【讨论】:

    • 谢谢,加布里埃尔。我想到了一个类似的解决方案。但是,问题是:如果设备在 20 分钟内没有改变它的位置,那么 'yourSavingCodeFunction()' 不会在此时间范围内执行。所以我的数据库没有更新,我没有当前的位置数据。例如,我如何知道不动的用户和关闭的手机之间的区别?我怎么能确定用户是否在他的家中?
    • 为什么即使用户没有移动,您也不能每 5 分钟更新一次您的位置?有没有一点为什么你只需要在它移动并且如果 20 分钟没有移动时才需要更新?即使用户没有移动也更新它似乎更好,因为您不需要检查和计算当前位置,所以它少了一步。
    • 实际上,对于 iOS,该插件不允许每 x 分钟更新一次位置,正如所有者在此处所述:forum.ionicframework.com/t/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    相关资源
    最近更新 更多