Геокодирование и регионы
Преобразуйте координаты в адреса и отслеживайте регионы.
«Геокодирование и регионы» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Что такое геокодирование
Геокодирование преобразует адрес, указанный человеком, в координаты, а обратное геокодирование преобразует координаты обратно в понятный адрес. Core Location предоставляет CLGeocoder для обеих операций, обращаясь к серверам Apple.
import CoreLocation
let geocoder = CLGeocoder()Прямое геокодирование адреса
Вызовите geocodeAddressString(_:), передав адрес в свободной форме. Завершение операции возвращает массив объектов CLPlacemark; возьмите первый объект и прочитайте его location.
geocoder.geocodeAddressString("Eiffel Tower, Paris") { placemarks, error in
if let coord = placemarks?.first?.location?.coordinate {
print(coord.latitude, coord.longitude)
}
}Обратное геокодирование координат
Для переданного объекта CLLocation метод reverseGeocodeLocation(_:) возвращает метки места, описывающие эту точку: улицу, город, страну, почтовый индекс и другие сведения.
let loc = CLLocation(latitude: 48.8584, longitude: 2.2945)
geocoder.reverseGeocodeLocation(loc) { placemarks, error in
if let p = placemarks?.first {
print(p.name ?? "", p.locality ?? "", p.country ?? "")
}
}Структура CLPlacemark
CLPlacemark предоставляет множество полей: name, thoroughfare (улица), locality (город), administrativeArea (административный регион), postalCode, country и isoCountryCode. Многие из них необязательны, поэтому извлекайте их значения осторожно.
func format(_ p: CLPlacemark) -> String {
[p.thoroughfare, p.locality, p.country]
.compactMap { $0 }
.joined(separator: ", ")
}Ограничения геокодера
CLGeocoder использует сеть и имеет ограничение частоты запросов. Выполняйте по одному запросу за раз, избегайте тесных циклов и отменяйте выполняющуюся операцию с помощью cancelGeocode(), когда результат больше не нужен.
geocoder.cancelGeocode()Геокодирование с async/await
Современный Swift предлагает асинхронные варианты, позволяющие писать линейный код с помощью try await вместо обработчиков завершения.
func coordinate(for address: String) async throws -> CLLocationCoordinate2D? {
let placemarks = try await geocoder.geocodeAddressString(address)
return placemarks.first?.location?.coordinate
}Знакомство с мониторингом регионов
Мониторинг регионов (геозоны) позволяет системе уведомлять Ваше приложение, когда устройство входит в заданную круговую область или выходит из неё, даже если приложение не запущено. Для этого требуется разрешение «Всегда».
// Requires NSLocationAlwaysAndWhenInUseUsageDescription
manager.requestAlwaysAuthorization()Определение CLCircularRegion
Геозона представляет собой CLCircularRegion с центром, радиусом (в метрах) и уникальным идентификатором. Установите notifyOnEntry и notifyOnExit, чтобы выбрать интересующие Вас события.
let region = CLCircularRegion(
center: CLLocationCoordinate2D(latitude: 41.0, longitude: 29.0),
radius: 200,
identifier: "OfficeZone"
)
region.notifyOnEntry = true
region.notifyOnExit = trueЗапуск мониторинга регионов
Вызовите startMonitoring(for:), чтобы начать мониторинг. Устройство устанавливает ограничение (около 20 регионов на приложение), поэтому одновременно отслеживайте только наиболее важные регионы.
if CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) {
manager.startMonitoring(for: region)
}Получение событий входа и выхода
Методы делегата didEnterRegion и didExitRegion вызываются при пересечении границ. Используйте identifier региона, чтобы определить, какая геозона вызвала событие.
func locationManager(_ m: CLLocationManager, didEnterRegion region: CLRegion) {
print("Entered:", region.identifier)
}
func locationManager(_ m: CLLocationManager, didExitRegion region: CLRegion) {
print("Exited:", region.identifier)
}Запрос текущего состояния
Чтобы узнать, находится ли устройство уже внутри региона, не дожидаясь пересечения границы, вызовите requestState(for:). Результат поступает в didDetermineState в виде .inside, .outside или .unknown.
manager.requestState(for: region)
func locationManager(_ m: CLLocationManager,
didDetermineState state: CLRegionState,
for region: CLRegion) {
print(region.identifier, state == .inside ? "inside" : "outside")
}Быстрая проверка: геокодирование и регионы
Проверьте, насколько хорошо Вы усвоили материал.
Итоги: геокодирование и регионы
Вы научились преобразовывать адреса в координаты и обратно, а также отслеживать географические границы:
CLGeocoderвыполняет прямое и обратное геокодирование (существуют асинхронные варианты); частота запросов ограничена.CLPlacemarkсодержит подробные поля адреса, каждое из которых является необязательным.CLCircularRegionопределяет геозоны; для мониторинга требуется разрешение «Всегда».- Обрабатывайте события
didEnterRegion/didExitRegionи запрашивайте состояние с помощьюrequestState(for:).
Часто задаваемые вопросы
Урок «Геокодирование и регионы» бесплатный?
Да — полный текст урока «Геокодирование и регионы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Геокодирование и регионы»?
Преобразуйте координаты в адреса и отслеживайте регионы. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Геокодирование и регионы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Запрос разрешения на геолокацию
- Получение местоположения пользователя
- Отображение карт в SwiftUI
- Геокодирование и регионы