728x90
728x90
SwiftUI로 개발을 시작하며 몰랐던 내용을 간단히 정리해보려 한다.
SwiftUI 앱에서 사용자의 위치 정보에 접근하기 위해서는 CoreLocaiton.locationManager를 사용해야 한다.
대부분 사용자가 View와 ViewModel을 사용하여 개발을 할 것인데, 여기서는 ViewModel에 대해 간단히 다루도록 하겠다.
ViewModel에 CLLocationManagerDelegate를 상속받도록 하고, locationManager를 선언한다
import CoreLocation
final class MapViewModel: NSObject, ObservableObject, CLLocationManagerDelegate {
var locationManager: CLLocationManager?
...
또한, VM 내에 사용자의 위치를 실시간으로 받아올 @Published 변수를 선언한다
@Published var userLatitude: Double = 0
@Published var userLongitude: Double = 0
사용자의 위치 업데이트를 시작하거나, 중지하기 위한 함수를 선언한다.
또한, locationManager 함수를 override하여 위치를 두 변수에 저장하도록 코드를 작성한다.
func startUpdatingLocation() {
self.locationManager?.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
userLatitude = location.coordinate.latitude
userLongitude = location.coordinate.longitude
}
다른 뷰에서 아래처럼 onAppear에서 호출하여 사용자 위치 업데이트를 시작하고, VM의 변수를 통해 받아올 수 있다.
@Published 변수이기 때문에 값이 업데이트되면 의존성이 있는 뷰를 업데이트하게 된다.
import SwiftUI
struct MapView: View {
@ObservedObject var vm: MapViewModel
var body: some View {
Text("\(vm.userLatitude), \(vm.userLongitude)")
.onAppear {
vm.startUpdatingLocation()
}
}
}
#Preview {
@ObservedObject var vm = MapViewModel()
return Group {
MapViewTestView(vm: vm)
}
}
만약 거리 등을 계산하고 싶다면, @State 변수를 함께 사용하면 실시간으로 계산이 가능하다.
(물론 사용자의 위치 정보를 가져오기 위해 WhenInUse 혹은 Always 위치 정보 접근 권한이 허가되어 있어야 한다)
영상을 보면 약 1초 간격으로 위치가 계속 업데이트되는 것을 확인할 수 있다.
728x90
728x90