[swift] PromiseKit로 앱 내 GPS 위치 추적 및 경로 탐색 구현 방법

PromiseKit는 비동기 작업을 더 쉽게 처리할 수 있도록 도와주는 Swift 프레임워크입니다. 이번 포스트에서는 PromiseKit를 사용하여 앱 내에서 GPS 위치 추적 및 경로 탐색을 어떻게 구현할 수 있는지 알아보겠습니다.

1. PromiseKit 설치

먼저, PromiseKit를 설치해야 합니다. 프로젝트의 Podfile에 다음 코드를 추가한 후, 터미널에서 pod install 명령어를 실행하여 PromiseKit을 설치합니다.

pod 'PromiseKit'

2. CLLocationManager 설정

GPS 위치 정보를 가져오기 위해 CLLocationManager를 사용해야 합니다. CLLocationManagerCLLocationManagerDelegate 프로토콜을 구현하여 위치 업데이트 이벤트를 처리할 수 있습니다. 다음은 CLLocationManager 설정 예제입니다.

import CoreLocation

class LocationManager: NSObject, CLLocationManagerDelegate {
    let locationManager = CLLocationManager()
    
    override init() {
        super.init()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
    }
    
    func requestLocationPermission() -> Promise<Bool> {
        let promise = Promise<Bool> { resolver in
            self.locationManager.requestWhenInUseAuthorization()
            resolver.fulfill(true)
        }
        return promise
    }
    
    func getCurrentLocation() -> Promise<CLLocation> {
        let promise = Promise<CLLocation> { resolver in
            self.locationManager.requestLocation()
            
            DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
                if let location = self.locationManager.location {
                    resolver.fulfill(location)
                } else {
                    let error = NSError(domain: "LocationError", code: 0, userInfo: nil)
                    resolver.reject(error)
                }
            }
        }
        return promise
    }
}

위 코드에서는 LocationManager 클래스를 정의하고, 초기화할 때 CLLocationManager 객체를 생성하고 초기 설정을 수행합니다. 그리고 requestLocationPermission() 함수를 사용하여 위치 권한 허용 요청을 실행하는 Promise를 반환하고, getCurrentLocation() 함수를 사용하여 현재 위치를 가져오는 Promise를 반환합니다.

3. Promise 사용하기

PromiseKit에서는 then, catch, finally 메서드를 사용하여 비동기 작업의 성공, 실패, 완료를 처리할 수 있습니다. 이를 이용하여 GPS 위치 추적 및 경로 탐색을 구현할 수 있습니다. 다음은 예제 코드입니다.

let locationManager = LocationManager()

locationManager.requestLocationPermission().then { permissionGranted -> Promise<CLLocation> in
    return self.locationManager.getCurrentLocation()
}.then { location -> Promise<[CLLocation]> in
    return self.getDirections(from: location, to: destination)
}.done { path in
    self.displayDirections(path)
}.catch { error in
    self.handleLocationError(error)
}.finally {
    self.locationManager.stopUpdatingLocation()
}

위 코드에서는 requestLocationPermission() 함수를 호출하여 위치 권한을 요청하고, 권한이 허용된 후에는 getCurrentLocation() 함수를 호출하여 현재 위치를 가져옵니다. 그 다음, getDirections(from:to:) 함수를 호출하여 경로를 탐색하고, displayDirections(_:) 함수를 사용하여 경로를 표시합니다. 만약 에러가 발생할 경우, handleLocationError(_:) 함수를 호출하여 에러를 처리합니다. 모든 작업이 완료된 후에는 stopUpdatingLocation() 메서드를 호출하여 위치 업데이트를 중단합니다.

위의 예시 코드에서 getDirections(from:to:), displayDirections(_:), handleLocationError(_:) 등의 함수는 구현되어 있어야 합니다.

결론

이렇게 PromiseKit를 사용하여 앱 내에서 GPS 위치 추적 및 경로 탐색을 구현할 수 있습니다. PromiseKit를 사용하면 비동기 작업을 보다 간편하게 다룰 수 있으며, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.

참고 자료: