Геолокация.GetLastKnownLocationAsync() иногда возвращает нуль

#xamarin #xamarin.essentials

#xamarin #xamarin.essentials

Вопрос:

Это в iOS 12.1.4 на iPhone 6s. Обычно Geolocation.GetLastKnownLocationAsync() работает, но иногда это не так. Это точно такой же код, но если я сижу здесь и нажимаю кнопку «получить широту и долготу» снова и снова, в конечном итоге Geolocation.GetLastKnownLocationAsync() выдается значение null.

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

 var location = await Essentials.Geolocation.GetLastKnownLocationAsync(); // works most of the time but sometimes it doesn't work.
  

Это мое предлагаемое решение:

 Essentials.Location location = null;
for(var i = 0; i < 10; i  )
{
    location = await Essentials.Geolocation.GetLastKnownLocationAsync();
    if(location == null)
    {
        Thread.Sleep(1000);
    }
    else
    {
        break;
    }
}
  

Ответ №1:

Во-первых, использовать это действительно плохая практика Thread.Sleep (если только вы не находитесь в цикле main / UI), поскольку вы зависаете в цикле run, если вам действительно нужна задержка, используйте await Task.Delay(... . Также CLLocationManager на iOS выполняется основной цикл, и если вы блокируете его, передача сообщений зависает, и менеджер location manager не может отчитаться перед приложением.

«Рассылающий спам» CLLocationManager.Местоположение (которое Essentials использует в iOS) может (и будет) приводить к нулевым возвратам из-за обновлений, ограничивающих скорость работы ОС (в основном, в целях экономии заряда батареи), и если ОС включает GPS-радиоприемник для обновления своего местоположения, этот метод будет отключен от ОС по таймауту, что приведет к nil возврату GetLastKnownLocationAsync отчета, и, таким образом, вы получите возврат null .

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

Вы можете получить последнее известное местоположение устройства, вызвав метод GetLastKnownLocationAsync. Часто это быстрее, чем выполнение полного запроса, но может быть менее точным.

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

Для запроса координат местоположения текущего устройства можно использовать GetLocationAsync. Лучше всего передать полный GeolocationRequest и CancellationToken, поскольку для получения местоположения устройства может потребоваться некоторое время.

Обычно я рекомендую использовать GetLastKnownLocationAsync как быстрый способ получить общую область пользователя, зная, что это также может вернуться null . Затем продолжайте выполнять GetLocationAsync (передавая как GeolocationRequest, так и экземпляр CancellationToken) в фоновом режиме и соответствующим образом обновляйте приложение для получения более точного и последнего местоположения.

re:https://learn.microsoft.com/en-us/xamarin/essentials/geolocation?tabs=ios

Комментарии:

1. Еще раз спасибо @SushiHangover