Плагин фоновой геолокации: отслеживание местоположения и обновление базы данных каждые 5 минут

В настоящее время я разрабатываю мобильное приложение с использованием AngularJS / Ionic 3.

Мне нужно отслеживать все время, если мои пользователи находятся в радиусе 100 м от определенной геолокации (давайте назовем это "Местное местоположение". Мне нужно всегда знать, кто находится у себя дома, а кто нет (даже когда приложение работает в фоновом режиме или закрыто / завершено).

Я подумал, чтобы понять это, используя плагин Ionic Native Background-Geolocation и https://github.com/mauron85/cordova-plugin-background-geolocation. Мой план состоял в том, чтобы проверять геолокацию пользователей каждые 5 минут и сравнивать ее с домашней.

Случай 1) Если расстояние между двумя точками < 100 м, я знаю, что пользователь "дома". Затем я обновил бы пользовательский узел в моей базе данных (Firebase), чтобы пометить пользователя как isAtHome: true и добавьте текущую метку времени.

Случай 2) Если пользователь не находится в пределах 100 м от его домашнего местоположения, я бы отметил его как isAtHome: false и добавьте текущую метку времени.

Мне нужно обновить базу данных даже в том случае, если пользователь не двигался, потому что мне нужно знать, что я получил текущий сигнал. В противном случае, я не знаю, если бы он не двигался или не выключил свой смартфон, например.

Если я хочу узнать, кто из моих пользователей находится у него дома, я бы проверил isAtHome-атрибуты и если они установлены в trueЯ бы проверил отметку времени, чтобы убедиться, что у меня есть обновленные данные, и эти данные были записаны в течение последних 15 минут.

Я пробовал много разных вещей, но я не уверен, как реализовать это с плагином Cordova Background Geolocation и если это вообще возможно.

Мой вопрос:

Можно ли проверять геолокацию пользователей каждые 5 минут (даже в фоновом / завершенном состоянии) и вызывать функцию, которая соответственно обновляет мою базу данных Firebase? Как описано, мне нужно получить местоположение, даже если пользователь не двигался в течение последних 5 минут.

Если это невозможно: у кого-нибудь есть идея, как подойти к требованиям по-другому?

Большое спасибо за Вашу помощь!

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

Другие вопросы по тегам