Geolocation and Maps in Swift: CoreLocation and MapKit for iOS/macOS

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

Geolocation and Maps in Swift: Overview of CoreLocation and MapKit



Developing applications for iOS and macOS often requires working with geographic data and map visualization. In the Apple ecosystem, there are two powerful frameworks for these purposes: CoreLocation (for determining location, geocoding, and monitoring regions) and MapKit (for displaying maps, adding annotations, and building routes). In this article, we will thoroughly examine their capabilities and provide practical examples in Swift.



1. CoreLocation: Obtaining Device Coordinates



CoreLocation provides access to hardware for determining location: GPS, Wi-Fi, and cellular networks. To get started, you need to import the framework and request permission from the user.



Setting Up Permissions

Add the following keys to the Info.plist file:

  • NSLocationWhenInUseUsageDescription — for using the app in active mode
  • NSLocationAlwaysAndWhenInUseUsageDescription — for background monitoring


Example of Getting Current Location

import CoreLocation

class LocationManager: NSObject, CLLocationManagerDelegate { private let manager = CLLocationManager() override init() { super.init() manager.delegate = self manager.desiredAccuracy = kCLLocationAccuracyBest } func requestPermission() { manager.requestWhenInUseAuthorization() } func startUpdating() { manager.startUpdatingLocation() } // MARK: - Delegate func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { guard let location = locations.last else { return } print("Latitude: \\(location.coordinate.latitude), Longitude: \\(location.coordinate.longitude)") } func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { print("Error: \\(error.localizedDescription)") }}


2. MapKit: Displaying Maps and Annotations



MapKit allows you to embed Apple Maps into your application. The main class is MKMapView. Let's look at basic setup and adding pins.



Creating a Map in Code

import MapKitimport SwiftUI

struct MapView: UIViewRepresentable { @Binding var region: MKCoordinateRegion func makeUIView(context: Context) -> MKMapView { let mapView = MKMapView() mapView.delegate = context.coordinator return mapView } func updateUIView(_ uiView: MKMapView, context: Context) { uiView.setRegion(region, animated: true) } // Coordinator for handling events func makeCoordinator() -> Coordinator { Coordinator(self) } class Coordinator: NSObject, MKMapViewDelegate { var parent: MapView init(_ parent: MapView) { self.parent = parent } }}


Adding an Annotation (Pin on the Map)

import MapKit

class CustomAnnotation: NSObject, MKAnnotation { var coordinate: CLLocationCoordinate2D var title: String? var subtitle: String? init(coordinate: CLLocationCoordinate2D, title: String, subtitle: String) { self.coordinate = coordinate self.title = title self.subtitle = subtitle }}

// Usage:let annotation = CustomAnnotation( coordinate: CLLocationCoordinate2D(latitude: 55.7558, longitude: 37.6173), title: "Moscow", subtitle: "Red Square")mapView.addAnnotation(annotation)


3. Geocoding: Converting Address to Coordinates



The CLGeocoder class allows you to convert a text address into coordinates (forward geocoding) and vice versa (reverse).



import CoreLocation

l

Recommendations