0Pricing
Swift Academy · Урок

Геокодирование и регионы

Преобразуйте координаты в адреса и отслеживайте регионы.

«Геокодирование и регионы» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Запрос разрешения на геолокацию
  2. Получение местоположения пользователя
  3. Отображение карт в SwiftUI
  4. Геокодирование и регионы
← Назад к Swift Academy