본문 바로가기
ios 뽀개기/ios 강좌

ios 코어 로케이션 프레임워크로 위치 정보 수집하기

by 인생여희 2018. 5. 17.
반응형

ios 코어 로케이션 프레임워크로 위치 정보 수집하기



1. 코어로케이션 매니져

코어 로케이션 프레임워크의 주요 클래스는 CLLocatoinManagerCLLocatoin 이다 

CLLocatoinManager 클래스의 인스턴스는 아래처럼 생성가능하다.


var locatoinManager : CLLocatoinManager = CLLocatoinManager()


CLLocatoinManager 인스턴스로 두 메서드 중 하나를 호출 할 수 있다


포그라운드에 있을 때만 위치정보를 추척한다면

locatoinManager.requestWhenInUseAuthorizatoin()


백그라운드에 있을 때도 위치추적을 하는 경우라면

locatoinManager.requestAlwaysAuthorizatoin()


2.위치정보 수집을 위한 허가 구하기

Info.plist 파일 내에 포함된 Information Property List 딕셔너리에 특정 값을 추가하는데 아래 키가 그 값들 중 하나다.


NSLocatoinWhenInUseUsageDescriptoin - 애플리케이션이 포그라운드에서 실행될 때 현재 위치를 접근해야 하는 이유를 사용자에게 묻는다.


NSLocatoinAlwaysUsageDescriptoin - 애플리케이션이 실행되는 동안 (백그라운드에서도) 현재 위치 데이터를 접근해야 하는 이유 설명


3.위치 정확도 설정

정확도의 단계는 CLLocatoinManager객체의 desiredAccuracy 속성을 통해 설정가능하다. 중요한점은 베터리를 많이 소모한다는 점!

이 속성을 설정하기 위해 정의된 상수 값은 아래와 같다


kCLLocatoinAccuracyBestForNavigation - 가장 높은 수준의 정확도, 외부 전원이 연결되어 있을 경우에만 사용


kCLLocatoinAccuracyBest - 베터리로 동작할 때 권장되는 가장 높은 수준의 정확도


kCLLocatoinAccuracyNearestTenMeters - 10미터 이내의 정확도


kCLLocatoinAccuracyHundredMeters - 100미터 이내의 정확도


kCLLocatoinAccuracyKilometer - 1키로미터 이내의 정확도


kCLLocatoinAccuracyThreeKilometers - 3키로미터 이내의 정확도


예)

locatoinManager.desiredAccuracy = kCLLocatoinAccuracyKilometer


4. 거리 필터 구성하기

로케이션 매니저가 위치 변화를 알려주는 기본 설정은 디바이스 위치가 변할 때마다 알려주는 것이다. 

로케이션 매니저의 distanceFilter 속성을 사용하면 어느 정도 거리의 위치 변화가 생겼을 때 앱이 알림을 받을지 말지를 설정할 수 있다.

예를 들면 distanceFilter가 1000미터로 설정되어 있으면 앱은 1000미터 이상의 위치 변화가 생겼을 때 알림을 받는다.


locatoinManager. distanceFilter = 1500.0


kCDistanceFilterNone 상수를 사용해서 distanceFilter 설정을 취소할 수 있다.


locatoinManager. distanceFilter = kCDistanceFilterNone


#로케이션 매니져 델리게이트

 로케이션 매니저는 CLLocationManagerDelegate 프로토콜에 정의된 두 개의 메서드를 사용하여 위치 정보 변경과 에러를 알려준다.

이 프로토콜을 따르기 위해 구현해야 할 두개의 메서드 템플릿은 아래와 같다.


    //위치가 변경될 때마다  이 메서드가 호출되며 가장 최근 위치 데이터를 배열의 마지막 객체에 포함하는 CLLocatoin 객체들의 배열이 인자로 전달된다.

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        // 위치 데이터 업데이트 처리

    }

    

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {

        //에러 처리

    }

    

    //앱의 위치 추적 허가 상태가 변경되면 이 메서드를 호출해서 알려준다.

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

        // 사용자에 의해서, 더이상 앱이 위치 정보를 얻지 못하게 될 수 있다.

        // 현재의 상태를 체크하고 그에 맞는 처리를 실시한다.


}


어떤 클래스가 로케이션 매니저를 위하 델리게이트로 구성된다면 객체는 로케이션 매니저 인스턴스에 할당되어야 한다. 

대부분의 경우, 델리게이트는 로케이션 매니저가 있는 뷰 컨트롤러 자신이 될 것이다.


locatoinManager.delegate = self


#위치 업데이트 시작

위 처럼 설정되고 사용자로부터 접근 허가를 받았다면, 로케이션 매니저는 위치정보추적을 시작하도록 지시할 수 있다.

locatoinManager.startUpdatingLocation()


위치가 업데이트 될 때마다 로케이션 매니저에 의해 didUpdateLocations 델리게이트 메서드가 호출되고, 현재 위치에 대한 정보가 전달 된다.


#CLLocatoin 객체에서 위치 정보 얻기

위치 정보는 didUpdateLocation 델리게이트 메서드를 통해 CLLocation  객체의 형태로 전달된다. CLLocation 객체는 다음의 데이터를 포함하고 있다.


Latitude

Longtitude

Horizontal Accuracy

Altitude

Altitude Accuracy


경도와 위도

경도와 위도 값은 CLLocationDegrees의 형태로 저장되어 있으며, 다음과 같이 CLLocation 객체로 부터 얻어진다.

let currentLatitude : CLLocationDistance = location.coordinate.latitude

let currentLongtitue : CLLocationDistance = location.coordinate.longtitude


정확도 

수평, 수직 정확도는 CLLocationAccuracy에 미터 단위로 저장된다.

let verticalAccuracy : CLLocationAccuracy = location.verticalAccuracy

let horizontalAccuracy : CLLocationAccuracy = location.horizontalAccuracy


고도

해발고도 값은 CLLocationDistance에 미터 단위로 저장된다.

let altitude: CLLocationDistance = location.altitude


현재위치

로케이션 매니저에서 얻으려는 것이 연속적인 위치업데이트가 아니라 사용자의 현재 위치라면 로케이션 매니저 인스턴스의 requestLocation 메서드를 호출하여 얻을 수 있다.

이 메서드는 현재 위치를 식별하여 현재 위치 정보를 전달하며, didUpdateLocations 델리게이트 메서드를 한 번 호출 한다. 그런다음, 위치 업데이트는 자동으로 꺼진다.

locationManager.requestLocation()


거리계산하기

두 CLLocation 지점 간의 거리는 끝 지점의 distanceFromLocation 메서드에 시작 지점을 인자로 넘겨주어 계산할 수 있다. startLocation과 endLocation 간의 거리를 계산한다.

var distance: CLLocationDistance = endLocation.distanceFromLocation(startLocation)


애플리케이션이 백그라운드 상태에서 위치 정보의 변화를 업데이트 받아야 한다면 applicationDidEnterBackground 메서드에서 로케이션 매니저 객체의 startMonitoringSignificantLocationChanges 메서드를 호출하여 정확도를 낮춰야 베터리 소모를 줄일 수 있다.



반응형

댓글