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

в настоящее время я делаю гибридное приложение, используя ionic/cordova. Приложение нуждается в функциональности, где он пингует наш бэкэнд с его местоположением каждые 1 минуту или около того, и бэкэнд API ответит, если что-нибудь интересное находится поблизости. Если ответ да, приложение будет стоять в очереди локальное уведомление, которое, надеюсь, заставит пользователя открыть приложение. Эта функция необходима, когда приложение находится в фоновом режиме, даже когда телефон заблокирован. Приложение должно быть развернуто в app store, google play и, в конечном итоге, Windows phone.

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

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 и app store?

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

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

3 ответов


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

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

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

  2. Это определенно будет работать для Android и iOS, но IMHO это работает лучше для Android, чем последний, насколько точность и функциональность keep alive.

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

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

удачи.


этот плагин имеет отличное руководство по использованию сервера meteor и cordova, чтобы сделать то, что вам нужно:

zeroasterisk / Метеор-Кордова-геолокация-фон

он настраивается автоматически с android и iOS. Для windows phone я не знаю.

  1. Meteor настраивает этот плагин в Cordova (вы должны настроить)
  2. Meteor настраивает этот плагин в Cordova (вы должны настроить)
  3. метеор может триггер фоновой службы, чтобы получить геолокации (GPS) детали
  4. фоновая служба Cordova периодически отправляет свои данные на сервер Meteor (а не на экземпляр клиента Cordova)
  5. Meteor Server может обновить коллекцию (или что-нибудь еще)
  6. Meteor клиент синхронизируется с сервером

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

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

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

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

enter image description here