Геолокация работает на Android очень медленно - PullRequest
0 голосов
/ 01 июля 2018

Я создаю приложение, используя Ionic / Angular / Firebase.

Приложение требует геолокации пользователя. Я использую плагин геолокации Ionic native и сталкиваюсь с некоторыми проблемами со скоростью для Android.

  • На ПК для получения тока требуется менее 500 миллисекунд геолокации.

  • На iOS это занимает около 1 секунды.

  • На Android это занимает 6+ секунд, а иногда и вовсе выходит из строя.

Это проблема с Ionic Native? Есть ли специальный плагин для Android?

Вот мой код:

this.geolocation.getCurrentPosition({enableHighAccuracy: false, timeout: 3000, maximumAge: 100000}).then((resp) => {
   this.userLocation.lat = resp.coords.latitude;
   this.userLocation.lng = resp.coords.longitude;
   this.getLocation();
}).catch((error) => {
  this.geolocation.getCurrentPosition({enableHighAccuracy: true, timeout: 3000, maximumAge: 100000}).then((resp) => {
     this.userLocation.lat = resp.coords.latitude;
     this.userLocation.lng = resp.coords.longitude;
     this.getLocation();
  }).catch((error) => {
    this.userLocation.lat = this.userData.location.lat || 0;
    this.userLocation.lng = this.userData.location.lng || 0;
    //if fails, get users last known location.
    this.getLocation();
    console.log('Error getting location', error);
  });
  console.log('Error getting location', error);
});

Не могу представить, что этот код неправильный. Как я уже сказал, он прекрасно работает на ПК и iOS. Что мне следует делать, если пользователь работает на Android? Есть ли другой плагин, который я мог бы использовать? Любая помощь будет потрясающей!

Ответы [ 3 ]

0 голосов
/ 10 июля 2018

Используемый вами код работает.

То, о чем говорит @Maheshvirus, это плагин ' cordova-plugin-request-location-precision ', который фактически позволяет вам предлагать пользователю включить высокую точность определения местоположения (а также проверить и проверить, он включен в первую очередь) для GPS, который будет «использовать GPS, WiFi, Bluetooth или сотовые сети для определения местоположения». Я использую тот же плагин в своих приложениях, он работает хорошо.

Из-за быстрого поиска в Google кажется, что IOS не имеет режима высокой точности, потому что по умолчанию IOS использует GPS, Wi-Fi, Bluetooth и т. Д. Для определения вашего местоположения ... вы не можете включать и выключать его, как Android, что объясняет почему IOS всегда так быстро узнает, где вы находитесь. Таким образом, на устройствах Android вам нужно предложить пользователю включить его с помощью плагина, упомянутого @Maheshvirus. Который затем должен всегда оставаться включенным, если пользователь не изменит свой режим на режим экономии энергии или только на устройстве.

ПК должен иметь намного более быстрый Интернет и не должен иметь ограничений по объему данных или серьезного ограничения (если сетевой нейтралитет полностью не исчез или вы находитесь в каком-то другом ужасном месте), поэтому ваш браузер должен быть в состоянии довольно легко и быстро найти вас через модем / маршрутизатор, к которому вы подключены - см. ответ этого сообщения для получения более подробной информации.

Решение

Я слишком устал сейчас, чтобы получить вам нужный пример рабочего кода, но использование Geolocation.watchPosition () вместо getCurrentPosition () позволит вам получить местоположение намного быстрее по моему опыту используя его - и этот пользователь, кажется, проверил его . WatchPosition 'используется для регистрации функции-обработчика, которая будет вызываться автоматически при каждом изменении положения устройства'. Функция watchPosition также используется почти точно так же, как getCurrentPosition, за исключением того, что когда она вызывается, вы должны назначить ей идентификатор и использовать Geolocation.clearwatch (idname), когда закончите. Вот документы для watchPosition () . Так что круто то, что если пользователь перемещается или служба определения местоположения телефонов считает, что он перемещен, ему не нужно будет набирать еще один вызов на устройство GPS (что заставляет его так долго), поскольку GPS уже слушать.

Извините, я не предложил исправления кода, но надеюсь, что эти данные помогут. С этой проблемой я также столкнулся, когда использовал getCurrentPosition на разных устройствах. У вас не должно возникнуть проблем с реализацией watchPosition (), и вы должны сразу увидеть улучшения латентной локации андроида - особенно если вы заставите пользователя включить режим высокой точности определения местоположения с этим плагином ' cordova-plugin-request -распределение точности '

0 голосов
/ 10 июля 2018

У меня была похожая ситуация с Geolocation. Жизненно важно, чтобы вы вызывали нативные методы только после того, как Platform готов. Несмотря на то, что именно так вы и будете его называть, его игнорирование приведет к значительной задержке, прежде чем вы получите ответ от плагина, особенно в Android.

import { Platform } from 'ionic-angular'
...

constructor( private platform: Platform) { 
this.platform.ready().then(() => {
  //request location here
 })
}
...
0 голосов
/ 09 июля 2018

В коде нет ничего плохого. Я также столкнулся с той же проблемой в телефонах Android. Решение, которое я пробовал.

Ручное решение

  • Переход к настройке местоположения. Проверьте, установлен ли режим местоположения , а не на Device Only . Установите Высокая точность , а затем попробуйте
  • ВЫКЛ. И ВКЛЮЧИТЬ опцию настройки вашего местоположения, перейдя в настройки-> опцию местоположения. Перезагрузите телефон и попробуйте

  • Проверьте карту Google, получает ли она ваше текущее местоположение или нет. Попробуйте получить ваше текущее местоположение на карте Google. В любом случае, если карта Google не найдет ваше текущее местоположение, вы не сможете получить доступ к своему приложению.

Найдя текущее местоположение на карте Google, вы, вероятно, получите это местоположение в своем приложении.

Решение с использованием плагина

<plugin name="cordova-plugin-request-location-accuracy" spec="*" /> 
...