Geolocalização e Mapas em Swift: visão geral do CoreLocation e MapKit
O desenvolvimento de aplicativos para iOS e macOS frequentemente requer o trabalho com dados geográficos e visualização de mapas. No ecossistema Apple, existem dois frameworks poderosos para esses fins: CoreLocation (para determinar a localização, geocodificação e regiões de monitoramento) e MapKit (para exibir mapas, adicionar anotações e traçar rotas). Neste artigo, detalharemos suas capacidades e forneceremos exemplos práticos em Swift.
1. CoreLocation: obtendo coordenadas do dispositivo
O CoreLocation fornece acesso aos recursos de hardware de determinação de localização: GPS, Wi-Fi e redes celulares. Para começar, é necessário importar o framework e solicitar permissão ao usuário.
Configuração de permissões
No arquivo Info.plist, adicione as chaves:
NSLocationWhenInUseUsageDescription— para uso do aplicativo em modo ativoNSLocationAlwaysAndWhenInUseUsageDescription— para monitoramento em segundo plano
Exemplo de obtenção da localização atual
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("Erro: \\(error.localizedDescription)") }}2. MapKit: exibindo mapas e anotações
O MapKit permite incorporar mapas do Apple Maps no aplicativo. A classe principal é MKMapView. Vamos abordar a configuração básica e a adição de marcadores.
Criação do mapa no código
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 para processar eventos func makeCoordinator() -> Coordinator { Coordinator(self) } class Coordinator: NSObject, MKMapViewDelegate { var parent: MapView init(_ parent: MapView) { self.parent = parent } }}Adicionando uma anotação (pino no mapa)
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 }}
// Uso:let annotation = CustomAnnotation( coordinate: CLLocationCoordinate2D(latitude: 55.7558, longitude: 37.6173), title: "Moscou", subtitle: "Praça Vermelha")mapView.addAnnotation(annotation)3. Geocodificação: convertendo endereço em coordenadas
A classe CLGeocoder permite converter um endereço textual em coordenadas (geocodificação direta) e vice-versa (reversa).
import CoreLocation
l