GPS-координаты в фоновом режиме в приложении cordova

В настоящее время я делаю гибридное приложение с использованием ионной/кордовой. Приложение нуждается в функциональности, где он связывает наш сервер с его местоположением каждые 1 минуту или около того, а backend API ответит, если что-то интересное поблизости. Если да, приложение будет помещать в очередь локальное уведомление, которое, надеюсь, заставит пользователя открыть приложение. Эта функция необходима, когда приложение находится в фоновом режиме и даже когда телефон заблокирован. Приложение должно быть развернуто как в магазине приложений, так и в Google Play и в конечном итоге на телефоне Windows.

В настоящее время я использую комбинацию из этих трех плагинов:

https://www.npmjs.com/package/cordova-plugin-geolocation - для местоположения https://github.com/katzer/cordova-plugin-background-mode - для режима bg https://github.com/katzer/cordova-plugin-local-notifications - для локальных уведомлений

В настоящее время он работает на Android, когда устройство не заблокировано (поэтому оно работает в режиме переднего и заднего плана), но когда устройство заблокировано, оно не может получить координаты GPS.

В настоящее время мой код выглядит следующим образом:

        // Enable background worker          
        (cordova as any).plugins.backgroundMode.enable();

   intervalPromise = $interval(intervalWork, 30000, 0, false);

    function intervalWork() {
        $log.log('Trying to fetch pos');

        var options = { maximumAge: 30000, timeout: 30000, enableHighAccuracy: false };

        navigator.geolocation.getCurrentPosition(success,
            err,
            options);
    }

    function success(pos) {
        $log.log("lat: " + pos.coords.latitude + " long: " + pos.coords.longitude);

        var Checkin = $resource(ApiDataEndpoint.url + 'checkin/:lat/:lng/', {});

        var res= Checkin.get({ lat: pos.coords.latitude, lng: pos.coords.longitude });

               if (res) { 

                $cordovaLocalNotification.schedule({
                    id: 1,
                    title: 'test',
                    text: 'test',
                }).then(function(result) {
                    $log.log("ok");
                });
            };
         }

Итак... мои вопросы:

1) Как заставить решение работать, когда мое устройство заблокировано (getCurrentPosition вызывается, даже когда устройство заблокировано, но возвращает таймаут)?

2) Можно ли заставить это решение работать на iOS?

3) Будет ли приложение одобрено в Google Play и магазине приложений?

4) Если проект обречен, каковы мои альтернативы?

Мне действительно нужна помощь в этом!

Ответ 1

В настоящее время у меня есть приложение, которое решает все проблемы, перечисленные выше, и вот плагин, который я использую:

https://github.com/mauron85/cordova-plugin-background-geolocation

  1. Плагин использует watchPosition(), а не getCurrentPosition(), так как этот требует слишком много времени, чтобы постоянно пинговать устройство и потребляет больше энергии аккумулятора.

  2. Это определенно будет работать для Android & iOS, но ИМХО, он играет с Android лучше, чем с последним, с точки зрения точности и функциональности.

  3. Я запустил его в Google Play без проблем, Apple разрешает этот плагин, есть ряд приложений, использующих этот плагин в магазине Apple, но Apple, вероятно, первоначально отклонит его и спросит приложения о намерении использовать фон, вам придется сделать апелляцию о том, что приложение делает в фоновом режиме, и убедитесь, что оно не работает бесконечно (это был мой опыт).

    а. Вы также захотите убедиться, что вы указали на взгляды Apple, что у пользователя есть возможность отключить фоновое отслеживание геолокации. Я предполагаю, что есть? Это их главная проблема с использованием плагина.

Удачи.

Ответ 2

В этом плагине есть отличное руководство для использования метеоритного сервера и кордовы для выполнения необходимых действий:

zeroasterisk/meteor-cordova-geolocation-background

Он автоматически настраивается как с Android, так и с iOS. Для Windows Phone я не знаю.

  • Meteor настраивает этот плагин в Кордове (вы должны настроить)
  • Meteor настраивает этот плагин в Кордове (вы должны настроить)
  • Метеор может инициировать фоновое обслуживание, чтобы получить информацию о геолокации (GPS).
  • Справочная служба Cordova периодически отправляет данные на сервер Meteor (а не экземпляр Cordova клиента).
  • Meteor Server может обновлять коллекцию (или что-то еще)
  • Клиент Meteor синхронизируется с сервером

Ответ 3

Я столкнулся с одной и той же проблемой, используя те же плагины, которые вы использовали. Оказывается, это разрешение разрешений устройства.

Плагин-плагин с плагинами-плагинами не имеет разрешения на запуск в фоновом режиме, и, что более важно, он не имеет разрешения отслеживать GPS в фоновом режиме. Хотя плагин cordova-plugin-background-mode позволяет вам выполнять код в фоновом режиме, вы не сможете получить GPS-координаты в фоновом режиме.

Решение состоит в том, чтобы добавить плагин, который поддерживает получение данных о местоположении во время работы приложения в фоновом режиме. Есть несколько плагинов, которые поддерживают это, включая плагин mauron85/cordova-plugin-background-geolocation (как было предложено ранее). Альтернативой является использование плагина cordova-custom-config, который позволяет вам указать свои собственные пользовательские разрешения. Действительно, вы можете добавить любой плагин, если он поддерживает службы определения местоположения. Дополнительный код не требуется.

Вы можете убедиться, что у вас есть правильные разрешения, открыв настройки приложения (в iOS) и подтвердив, что доступна опция "Всегда".

введите описание изображения здесь