Плагин фоновой геолокации: отслеживание местоположения и обновление базы данных каждые 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