Во-первых, это действительно плохая практика - использовать 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