Прежде всего, проверьте, если вы установили конфиденциальность местоположения в вашем Info.plist
.В вашем случае я проверяю авторизацию в расширении.
CLLocationManagerDelegate
extension ViewController: CLLocationManagerDelegate{
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
checkLocationAuthorization()
}
Не забудьте установить делегата в viewDidLoad()
Делегат
locationManager.delegate = self
Теперь перейдем к актуальному вопросу.Я создал приватную функцию, которую можно вызывать в
locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
Поиск ближайшей аннотации
Я полагаю, у вас объявлен массив аннотаций (var annotation = [MKAnnotation]()
).Мы будем использовать эти аннотации (в моем случае Париж и Амстердам) по сравнению с нашим текущим местоположением, чтобы найти наиболее близкие.
private func getNearestPin(locations: [CLLocation]) -> MKAnnotation? {
let allPinsOnMap = mapView?.annotations
guard let currentLocation = locations.first else { return nil }
if let pins = allPinsOnMap {
let nearestPin: (CLLocationDistance, MKAnnotation?) = pins.reduce((CLLocationDistanceMax,nil))
{ (nearest, pin) -> (CLLocationDistance, MKAnnotation?) in
let coord = pin.coordinate
let loc = CLLocation(latitude: coord.latitude, longitude: coord.longitude)
let distance = currentLocation.distance(from: loc)
return distance < nearest.0 ? (distance, pin) : nearest
}
return nearestPin.1
}
return nil
}
Функция вернет MKAnnotation?
, поэтому, когда мы вызываем функцию, мы должны проверить, не возвращает ли она ноль.Мы называем эту функцию в нашем расширении!
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let nearest = getNearestPin(locations: locations) {
if nearest.title == "Amsterdam" {
print("Nearest is available: \(nearest.title! ?? "Title")")
}
}
}
Если у вас есть дополнительные вопросы или пожелания, пожалуйста, дайте мне знать!