Получение местоположения пользователя
Получайте обновления местоположения с помощью CLLocationManager.
«Получение местоположения пользователя» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Запуск обновлений местоположения
После получения авторизации вызовите startUpdatingLocation(), чтобы начать получать непрерывный поток определений местоположения. Менеджер передаёт их через делегат. Всегда вызывайте stopUpdatingLocation(), когда данные больше не нужны, чтобы экономить заряд батареи.
manager.startUpdatingLocation()
// ... later
manager.stopUpdatingLocation()Получение местоположений в делегате
Новые определения местоположения поступают в locationManager(_:didUpdateLocations:). Массив упорядочен от самых старых к самым новым, поэтому последний элемент содержит самое недавнее местоположение.
func locationManager(_ m: CLLocationManager,
didUpdateLocations locations: [CLLocation]) {
guard let latest = locations.last else { return }
print(latest.coordinate.latitude, latest.coordinate.longitude)
}Объект CLLocation
Каждое определение — это объект CLLocation, содержащий гораздо больше, чем координаты: coordinate, altitude, speed, course, timestamp и значения точности. Изучайте их, чтобы определить, достаточно ли надёжно полученное значение.
func describe(_ loc: CLLocation) {
print("lat:", loc.coordinate.latitude)
print("lon:", loc.coordinate.longitude)
print("alt:", loc.altitude)
print("when:", loc.timestamp)
}Желаемая точность
Установите desiredAccuracy, чтобы сообщить Core Location, насколько точными должны быть определения местоположения. Более высокая точность расходует больше энергии. Доступные константы включают kCLLocationAccuracyBest, kCLLocationAccuracyNearestTenMeters, kCLLocationAccuracyHundredMeters и kCLLocationAccuracyKilometer.
manager.desiredAccuracy = kCLLocationAccuracyNearestTenMetersФильтр расстояния
Используйте distanceFilter, чтобы подавлять обновления, пока устройство не переместится на минимальное число метров. Это уменьшает шум и экономит энергию в сценариях, где не нужно отслеживать каждое небольшое перемещение.
manager.distanceFilter = 50 // metersОценка качества определения
Свойство horizontalAccuracy задаёт радиус (в метрах), в пределах которого местоположение считается достоверным. Отрицательное значение означает, что определение недействительно. Также отклоняйте устаревшие определения, проверяя, насколько давно было получено значение timestamp.
func isUsable(_ loc: CLLocation) -> Bool {
guard loc.horizontalAccuracy >= 0 else { return false }
let age = -loc.timestamp.timeIntervalSinceNow
return age < 15 && loc.horizontalAccuracy < 100
}Запрос разового местоположения
Если Вам нужно только одно определение, а не поток данных, вызовите requestLocation(). Менеджер передаст одно местоположение делегату, а затем автоматически остановится. Это экономит заряд батареи по сравнению с запуском непрерывных обновлений.
manager.requestLocation()Обработка ошибок местоположения
Сбои поступают в locationManager(_:didFailWithError:). Часто встречается CLError.locationUnknown; обычно он временный — продолжайте ждать. CLError.denied означает, что разрешение отозвано, и отслеживание следует остановить.
func locationManager(_ m: CLLocationManager,
didFailWithError error: Error) {
if let clErr = error as? CLError, clErr.code == .denied {
m.stopUpdatingLocation()
}
}Отслеживание значительных изменений
Для малозатратного отслеживания с небольшой точностью, которое может разбудить приложение в фоновом режиме, используйте startMonitoringSignificantLocationChanges(). Обновление происходит только после перемещения устройства примерно на 500 метров, поэтому этот вариант хорошо подходит для функций, зависящих от региона.
manager.startMonitoringSignificantLocationChanges()Курс и направление
Для функций компаса startUpdatingHeading() передаёт магнитное или истинное направление через locationManager(_:didUpdateHeading:). Обратите внимание: CLLocation.course (направление движения) отличается от направления (ориентации устройства).
func locationManager(_ m: CLLocationManager,
didUpdateHeading newHeading: CLHeading) {
print("Heading:", newHeading.trueHeading)
}Вычисление расстояния между точками
CLLocation может измерить расстояние по прямой до другого местоположения с помощью distance(from:), возвращая результат в метрах. Это удобно для логики определения близости без какого-либо интерфейса карты.
let a = CLLocation(latitude: 41.0, longitude: 28.9)
let b = CLLocation(latitude: 41.1, longitude: 29.0)
let meters = a.distance(from: b)
print("Distance:", meters)Быстрая проверка: получение местоположения
Проверьте, насколько хорошо Вы умеете получать определения местоположения.
Итоги: получение местоположения пользователя
Теперь Вы знаете, как получать координаты:
startUpdatingLocation()— для потока данных,requestLocation()— для одного определения.- Читайте самое новое определение из
locations.lastв делегате. - Настраивайте
desiredAccuracyиdistanceFilter, выбирая баланс между расходом энергии и точностью. - Проверяйте
horizontalAccuracyиtimestampперед использованием определения.
Изучай Swift с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 122
- Уроки
- 409
Часто задаваемые вопросы
Урок «Получение местоположения пользователя» бесплатный?
Да — полный текст урока «Получение местоположения пользователя» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Получение местоположения пользователя»?
Получайте обновления местоположения с помощью CLLocationManager. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Получение местоположения пользователя»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Запрос разрешения на геолокацию
- Получение местоположения пользователя
- Отображение карт в SwiftUI
- Геокодирование и регионы