2014년 4월 24일 목요일

[iOS] CoreLocation Framework를 이용한 현재 위치 찾기

iOS에서는 Mapkit을 이용하면 간단하게 현재 위치를 지동 상에 표시하는 것이 가능하다. 하지만 이건 MKMapView 를 사용 할 때의 이야기이다. 맵뷰를 사용하지 않고 현재 위치를 찾으려면 CoreLocation Framework를 이용해야 한다.

우선 CoreLocation.framework 를 프로젝트에 추가해야 한다. 단 이 작업은 최신 Xcode에서 프레임워크 자동 추가 기능을 이용 할 때는 생략 가능하다.

그리고 ​CoreLocation 헤더를 소스코드에 추가한다.
#import <CoreLocation/CoreLocation.h>

이제 실제 코딩을 시작한다.

실제로 필요한 클래스는 CLLocationManager이다. 오브젝트를 생성하고 CLLocationManagerDelegate를 구현한 오브젝트를 delegate에 명시해 주면 된다.
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;

[locationManager startUpdatingLocation];
위 코드에서 delegate에 self를 지정했다. 따라서 위 코드가 구현된 클래스는 CLLocationManagerDelegate 프로토콜을 인터페이스에 명시해야 한다.

그리고 desiredAccuracy는 정확도인데 double 값을 받지만 아래와 같은 옵션이 미리 정의되어 있다.
kCLLocationAccuracyBestForNavigation
kCLLocationAccuracyBest
kCLLocationAccuracyNearestTenMeters
kCLLocationAccuracyHundredMeters
kCLLocationAccuracyKilometer
kCLLocationAccuracyThreeKilometers
원하는 정확도를 이용하면 될 것이다.

마지막으로 startUpdatingLocation 메서드를 호출함으로써 이제 CLLocationManager 는 위치가 바뀔 때 마다 CLLocationManagerDelegate 를 통해 현재 위치를 알려준다.

CLLocationManagerDelegate에서 구현할 메서드는 아래 하나면 족하다.
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    for (CLLocation *location in locations) {
        CLLocationCoordinate2D coordinate = location.coordinate;
        ...
    }
}
CLLocation의 coordinate 프로퍼티에 위도/경도가 있으니 이를 이용하면 된다.

CLLocation에는 horizontalAccuracy, verticalAccuracy 같은 정확도를 알려주는 프로퍼티도 있다. 정확도를 계속 감시해야 한다면 이를 활용하자.

관련포스트: [iOS] CLGeocoder를 이용해 현재 위치의 주소 얻기

댓글 없음 :