Интеграция Apple MapKit в iOS-приложение

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1735 услуг
Интеграция Apple MapKit в iOS-приложение
Средний
от 1 дня до 3 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

Интеграция Apple MapKit в iOS-приложение

MapKit — встроенный фреймворк Apple, никаких ключей и биллинга. Это главное преимущество над Google Maps SDK при разработке под iOS. Но за последние три мажорных версии iOS MapKit существенно изменился: SwiftUI-нативный Map view появился в iOS 14 и получил полноценный API аннотаций только в iOS 17. Если поддерживаете iOS 15+, придётся балансировать между новым и старым API.

MKMapView vs SwiftUI Map — что выбрать

MKMapView — зрелый UIKit-компонент с полным контролем через делегаты. Map из SwiftUI проще в базовых сценариях, но до iOS 17 не поддерживал кастомные аннотации в декларативном стиле — приходилось оборачивать MKMapView через UIViewRepresentable.

Для iOS 17+ SwiftUI Map с Annotation и MapPolygon покрывает большинство кейсов:

import MapKit

struct ContentView: View {
    @State private var position: MapCameraPosition = .region(
        MKCoordinateRegion(
            center: CLLocationCoordinate2D(latitude: 55.7558, longitude: 37.6173),
            latitudinalMeters: 5000,
            longitudinalMeters: 5000
        )
    )

    var body: some View {
        Map(position: $position) {
            Annotation("Офис", coordinate: CLLocationCoordinate2D(latitude: 55.7558, longitude: 37.6173)) {
                Image(systemName: "building.2.fill")
                    .foregroundStyle(.blue)
                    .padding(8)
                    .background(.white)
                    .clipShape(Circle())
            }
            UserAnnotation()
        }
        .mapStyle(.standard(elevation: .realistic))
        .mapControls {
            MapUserLocationButton()
            MapCompass()
            MapScaleView()
        }
    }
}

Для iOS 15-16 кастомные аннотации — только через MKMapView + UIViewRepresentable.

MKMapView: аннотации и делегат

class MapViewController: UIViewController, MKMapViewDelegate {
    private let mapView = MKMapView()

    override func viewDidLoad() {
        super.viewDidLoad()
        mapView.delegate = self
        mapView.frame = view.bounds
        mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        view.addSubview(mapView)

        let annotation = MKPointAnnotation()
        annotation.coordinate = CLLocationCoordinate2D(latitude: 55.7558, longitude: 37.6173)
        annotation.title = "Точка А"
        mapView.addAnnotation(annotation)
    }

    // Кастомный вид аннотации
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        guard !(annotation is MKUserLocation) else { return nil }

        let identifier = "CustomPin"
        var view = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
            as? MKMarkerAnnotationView

        if view == nil {
            view = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
            view?.canShowCallout = true
            view?.glyphImage = UIImage(systemName: "car.fill")
            view?.markerTintColor = .systemBlue
        } else {
            view?.annotation = annotation
        }
        return view
    }
}

MKMarkerAnnotationView — стандартный вид с поддержкой callout, glyphs из SF Symbols и кластеризации через clusteringIdentifier. Для полностью кастомного вида используйте MKAnnotationView с собственным UIView внутри.

Маршруты: MKDirections

MapKit строит маршруты через MKDirections.Request без дополнительной оплаты. Режимы: .automobile, .walking, .transit (только в поддерживаемых регионах).

func buildRoute(from: CLLocationCoordinate2D, to: CLLocationCoordinate2D) {
    let request = MKDirections.Request()
    request.source = MKMapItem(placemark: MKPlacemark(coordinate: from))
    request.destination = MKMapItem(placemark: MKPlacemark(coordinate: to))
    request.transportType = .automobile

    MKDirections(request: request).calculate { [weak self] response, error in
        guard let route = response?.routes.first else { return }

        self?.mapView.addOverlay(route.polyline, level: .aboveRoads)
        self?.mapView.setVisibleMapRect(
            route.polyline.boundingMapRect,
            edgePadding: UIEdgeInsets(top: 50, left: 50, bottom: 50, right: 50),
            animated: true
        )
    }
}

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    if let polyline = overlay as? MKPolyline {
        let renderer = MKPolylineRenderer(polyline: polyline)
        renderer.strokeColor = .systemBlue
        renderer.lineWidth = 4
        return renderer
    }
    return MKOverlayRenderer(overlay: overlay)
}

Геокодирование через CLGeocoder

Без обращения к Google или Yandex — CLGeocoder и MKLocalSearch работают на серверах Apple:

MKLocalSearch(request: {
    let req = MKLocalSearch.Request()
    req.naturalLanguageQuery = "Красная площадь, Москва"
    req.region = mapView.region
    return req
}()).start { response, _ in
    guard let item = response?.mapItems.first else { return }
    print(item.placemark.coordinate)
}

Важные ограничения

MapKit не поддерживает кастомные тайловые слои из сторонних источников так гибко, как Google Maps (нет прямого аналога TileOverlayProvider для произвольных XYZ-тайлов без серверной проксировки). Если нужны офлайн-карты или нестандартные тайлы — смотрите в сторону MapLibre Native или Mapbox.

Сроки

1–3 дня. Базовая карта с аннотациями — 1 день. Маршруты, кластеризация, поиск — 2–3 дня. Стоимость рассчитывается индивидуально после анализа требований.