본격적인 지도를 구현하기에 앞서 iOS에서 사용자의 위치 정보와 방향(Orientation) 을 얻기 위해서는 Core Location 프레임워크를 사용한다.
Core Location은 Wi-Fi, GPS, Bluetooth, 자력계(Magnetometer), 기압계(Barometer), 셀룰러 등 사용 가능한 모든 하드웨어를 활용해 기기의 위치와 관련된 정보를 제공한다.
Core Location의 기능을 사용하기 위해서는 CLLocationManager 클래스의 인스턴스를 생성하여 사용한다.
이 객체를 통해 위치 서비스의 구성, 시작, 중지가 가능하며, 비동기 이벤트를 통해 다양한 위치 정보를 수신할 수 있다.
iOS 17부터는 liveUpdates(_:) API를 사용하여 비동기 스트림으로 위치 데이터를 수신할 수 있다.
| 기능 | 설명 |
|---|---|
| 표준 및 중요 위치 업데이트 (Standard & Significant Updates) | 사용자의 현재 위치 변화를 실시간으로 추적하며, 정확도와 빈도는 앱의 필요에 따라 조정할 수 있습니다. |
| 지오펜싱 (Region Monitoring) | 사용자가 특정 지역(반경) 에 들어오거나 벗어날 때 이벤트를 발생시킵니다. |
| 비콘 탐지 (Beacon Ranging) | 근처의 iBeacon 장치를 감지하고 위치 정보를 제공합니다. |
| 방향 감지 (Compass Headings) | 기기의 나침반 방향 변화를 감지하여 제공합니다. |
[참고] https://developer.apple.com/documentation/corelocation
지도는 CoreLocation 만으로 표현할 수 없다.
지도에 위치를 시각화하고 상호작용하는 기능은 MapKit이 담당한다.
iOS 14부터 SwiftUI에서도 MapKit 사용할 수 있게 Map이라는 전용 뷰가 생겼으나 Deprecated가 아주 많으니 아래 꼭 참고하기.. ⭐️⭐️⭐️
https://developer.apple.com/documentation/mapkit

import SwiftUI
import MapKit
struct MapView: View {
@State var region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 37.5665, longitude: 126.9780), span: MKCoordinateSpan(latitudeDelta: 0.0, longitudeDelta: 0.05))
var body: some View {
Map(initialPosition: .region(region))
}
}
#Preview {
MapView()
}
MKCoordinateRegion : 지도에서 보여줄 영역(중심 좌표 + 줌 정도)Map : SwiftUI의 지도 컴포넌트(UIKit의 MKMapView 역할) -> Deprecated 매우 많음!!CLLocationCoordinate2D : 위도(latitude), 경도(longitude)앱이 위치 정보를 사용하려면 반드시 사용자에게 권한을 요청해야 한다.
그 전에 Info.plist 파일에 권한 사용 목적을 명시하는 문자열을 추가해야 한다.
| 권한 키 | 설명 |
|---|---|
| NSLocationWhenInUseUsageDescription | 앱 사용 중에만 위치 정보 접근 |
| NSLocationAlwaysUsageDescription | 백그라운드에서도 지속적인 위치 접근 |
<key>NSLocationWhenInUseUsageDescription</key>
<string>이 앱은 현재 위치를 표시하기 위해 위치 정보가 필요합니다.</string>