Geolocation.GetLastKnownLocationAsync () иногда возвращает ноль - PullRequest
1 голос
/ 29 марта 2019

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

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

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 Ответ

2 голосов
/ 29 марта 2019

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

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

CLLocationManager.Location на iOS, предназначенный для быстрого низкого-power возвращает из операционной системы в приложение, которое обновляется при запуске приложения, перезагрузке устройства и т. д., не каждый раз, когда вы вызываете его.

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

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

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

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

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

...