Как отслеживать местоположение устройства (iOS и Android) с помощью Phonegap

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

1) Мне нужны обновления в реальном времени или каждые 1 - 5 минут информации о том, какие устройства подключены и какие устройства только что отключены.

2) У меня был очень высокий пинг с моего ПК на мой iPhone в той же сети (до сих пор не знаю почему).

Теперь я хочу сделать это, используя геолокацию из приложения Phonegap (работающего в фоновом режиме), приостановленного на iOS или работающего в фоновом режиме на Android.

Любая помощь будет оценена по достоинству.

Ответ 1

Обновление 25 мая 2019

Мой оригинальный ответ ниже 6 лет и устарел относительно текущих версий мобильных ОС. Например, частичные wakelocks больше не работают на современных версиях Android.

Сегодня я рекомендую (если у вас серьезное коммерческое приложение, а не хобби-проект) использовать платную версию cordova-background-geolocation от Transistorsoft. Бесплатная версия работает для iOS, но для Android требуется лицензия, которая стоит порядка нескольких сотен долларов США. Однако я думаю, что цена того стоит: за мой 10+ многолетний опыт создания мобильных приложений с учетом местоположения это было самое изощренное и надежное решение, с которым я когда-либо сталкивался. За счет вашей лицензии вы получаете доступ к частному репо, которое постоянно обновляется и поддерживается для совместимости с новыми версиями Android и iOS.

Если вы ищете бесплатное решение с открытым исходным кодом, я бы выбрал cordova-plugin-background-geolocation, который является форком с открытым исходным кодом оригинального плагина Transistorsoft. Однако мой опыт работы с этим плагином был неоднозначным; из-за того, что он бесплатный/с открытым исходным кодом, он не обновляется так часто, как платный плагин Transistorsoft. Я столкнулся с проблемами из-за новых, более жестких ограничений на фоновое расположение в последних версиях Android, решение которых заняло значительное время или не было исправлено вообще (см. Список выпусков плагинов).

Оригинальный ответ (11 июня 2013 г.)

Первое, что нужно сказать, это то, что создание приложения Phonegap, которое получает обновления местоположения при работе в фоновом режиме, вполне возможно, но не тривиально. Я сделал это сам и выпустил приложения для платформ Android и iOS.

Если вам нужны точные и регулярные обновления местоположения, я бы рекомендовал использовать GPS-приемник на целевых устройствах. В Phonegap вы можете сделать это, установив флаг "highAccuracy" при запросе обновлений позиции. Функция watchPosition() будет доставлять новую информацию о местоположении по мере того, как устройство получает обновления от приемника GPS, поэтому вы используете его примерно так:

navigator.geolocation.watchPosition(successCallback, errorCallback, {
  enableHighAccuracy: true,
  timeout: 10000,
  maximumAge: 0
});

См. Документацию API геолокации Phonegap для получения более подробной информации (обратите внимание на разрешения, необходимые для этой работы на Android и iOS).

Чтобы приложение работало в фоновом режиме на Android или iOS, вам необходимо настроить соответствующие им собственные среды разработки: Eclipse для Android, XCode для iOS. Вы не сможете использовать PhoneGap Build, потому что в обоих случаях для его работы нужны пользовательские настройки. Посмотрите руководства платформы PhoneGap, чтобы узнать, как это сделать.

Чтобы ваше приложение работало в фоновом режиме на Android, вам нужно либо написать собственную службу Android, либо вы можете сделать то, что я сделал, и использовать плагин Phonegap, чтобы получить "частичную блокировку" (см. Здесь), чтобы ваше приложение работало в фон и получать обновления позиции, пока экран выключен. Обратите внимание, что оригинальная версия этого плагина устарела и не работает с более поздними версиями PhoneGap, а также не поддерживает частичные пробуждения. Однако я обновил и расширил его для собственного использования: исходный код для него можно найти в моем ответе на этот вопрос.

Чтобы приложение работало в фоновом режиме на iOS, вам нужно сделать что-то немного иначе; вам не нужен плагин, просто настройки проекта.

Вы можете вручную отредактировать .plist проекта и добавить ключ "UIBackgroundModes" со значением "location", или, когда ваш проект открыт в XCode, добавить ключ "Required Background Modes" со значением "App registers for location" обновления". Это заставит iOS вызывать функцию обратного вызова JS, которую вы зарегистрировали с помощью watchPosition(), каждый раз, когда получено обновление местоположения. Смотрите здесь для получения дополнительной информации о ключах проекта iOS и фоновых режимах.

Надеюсь это поможет!