Это ожидаемое поведение: местоположение пользователя не всегда отслеживается iPhone с помощью GPS (это потребляет много энергии).Поэтому, как только карта отображается, экземпляр MKMapView
показывает последнюю «лучшую» позицию пользователя, которую он знает, а затем повышает точность, активируя отслеживание (это простой процесс, вам не нужно об этом заботиться).
Вы можете отслеживать, когда MKMapView
обновляет местоположение пользователя на карте, применяя протокол MKMapViewDelegate
.Просто внедрите:
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
CLLocationAccuracy accuracy = userLocation.location.horizontalAccuracy;
if (accuracy ......) {
}
}
(Больше информации из документации Apple здесь )
Код выше в моем примере проверяет точность позиции, отображаемой в данный моментmapView и реагирует соответственно.
[РЕДАКТИРОВАТЬ]
Если показ местоположения пользователя в середине моря сначала действительно беспокоит вас, вы можете скрыть местоположение пользователя, пока не получите местоположение, которое является достаточно точным / свежим.
Для этого сначала установите для свойства showsUserLocation
MKMapView
значение NO
, пока не получите достаточно точное местоположение (благодаря предыдущему обратному вызову делегата), а затем установите для него YES
.
Byделая это, вы будете избегать отображения местоположения, которое не является точным или слишком старым для отображения (в CLLocation
есть свойство timestamp
, чтобы проверить, является ли оно старым или нет)
NB. Вы не должны создавать экземпляр CLLocationManager
на своей стороне, MKMapView создает один внутри и публикует местоположения, которые он получает с помощью этого селектора делегата.