대표적으로 지도앱과 같이 사용자의 위치를 이용한 앱들이 많다. 사용자 위치를 활용하기 위해 CoreLocation에 대해 알아보겠다.
Core Location은 애플의 여러 기기에서 위치정보를 활용할 수 있는 기능들을 제공하는 Framwork다.
Core Location을 이용하면 디바이스의 위치, 고도, 방향 또는 가까이 있는 iBeacon 장치와의 위치를 알 수 있다.
디바이스들은 어떤 방법으로 위치정보를 제공할 수 있는걸까?
Core Location은 기기의 여러 구성 요소를 사용하여 위치 데이터를 수집하고 있다.
이 구성 요소에는 Wi-Fi, GPS, Bluetooth, 자기장 센서, 기압계, 셀룰러 하드웨어를 사용한다고 한다.
생각보다 기기 안에 많은 장치들이 있다.
이러한 요소들을 통해 얻은 데이터를 개발과정에 활용하기 위해서는 CLLocationManger라는 클래스의 인스턴스를 사용해야 한다.
사용자의 위치정보들을 활용하기 위한 핵심 클래스인 CLLocationManger는 다음과 같은 위치 관련 정보를 제공한다.
뭔가 확실히는 이해가 되지 않기때문에 좀더 알아보자.
표준 위치(Standatd Location)와 중요 위치(Significant Location)업데이트?
: 표준 위치 업데이트는 사용자 위치를 주기적으로 업데이트 하며 GPS기반의 데이터를 활용하며, 사용자의 이동 경로나 위치에 대한 상세한 정보를 추적하는데 적합하다. 정확도 조절이 가능하며 정확한 위치 정보가 필요할 경우 더 많은 에너지를 소모하여 정확도를 높일 수 있다.
반대로 중요 위치 업데이트는 사용자의 위치가 크게 변결됭 때만 앱을 활성화시키고 업데이트 한다. 표준 위치 업데이트와 비교했을 때 배터리 소모가 적다. 대신 정확도가 높지 않으며 정확한 경로 추적이 필요하지 않은 경우 적합하다.
관심 지역(region)모니터링?
: 특정 지리적 지역을 모니터링, 사용자가 해당 지역에 들어가거나 나갈 때 알림을 받을 수 있음
iBeacon?
: iBeacon은 애플의 위치 서비스를 기반으로 작동하는 작은 무선디바이스로 주변 디바이스와 통신한다. 위에서 말하는 비콘 레인지는 이 iBeacon을 활용하여 기기간 상대적인 거리를 추정하는 작업이다. (혹시 애플 기기에 모두 내장되어 기기간 서로 거리를 추정하는거구나 라고 잠시 생각했는데 아니었다. iBeacon은 기기에 내장된게 아닌 별도의 작은 무선 디바이스였다.)
생각보다 다양한 기능들을 지원하고 있다.
이 중 사용자 위치 데이터에 엑세스 하는 방법을 알아보자
앱이 위치 데이터에 엑세스 하기 위해서는 사용자가 위치 서비스를 활성화 후 해당 앱에 대한 위치 권한을 허용받아야 한다.
+ iOS14부터는 항상 허용 권한은 직접 요청할 수 없다고 한다. 추후에 자세하게 알아보자.
import CoreLocation
class LocationManager: NSObject, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
...
}
func isLocationServicesEnabled() -> Bool {
return CLLocationManager.locationServicesEnabled()
}
locationManager.requestWhenInUseAuthorization() // 위치 데이터에 대한 엑세스 권한 요청
locationManager.delegate = self // 델리게이트 설정
locationManager.desiredAccuracy = kCLLocationAccuracyBest // 위치 업데이트의 정확도 설정
locationManager.distanceFilter = kCLDistanceFilterNone // 위치 데이터 업데이트가 빈번도 설정
locationManager.startUpdatingLocation() // 위치 업데이트 시작
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else {
return
}
print("Latitude: \(location.coordinate.latitude), Longitude: \(location.coordinate.longitude)")
}
현재 계획중인 앱을 만들기 위해서 위치정보가 필요하여 CoreLocation에 대해 알아보았다.
사용하는 방법은 생각보다 간단했다. 하지만 실제로 앱에 사용하기 위해서는 기기가 위치 서비스를 활성화 한 상태인지, 사용자가 어떤 종류의 권한을 허용했는지 등 여러 상황에 맞게 처리할 수 있어야 한다. 이런 내용은 이번 글에 담아내지 않았지만 가능하면 추후에 잘 정리해서 작성해보도록 하겠다.