Upload
jihoon-kong
View
594
Download
4
Embed Size (px)
Citation preview
What?
- 코어 로케이션의 종류는 뭐가 있을까?
- 코어 로케이션을 구현하는 데 필요한것들
- Where Am I
Core Location 의 종류
Core Location 의 종류
1.GPS- 여러 위성으로부터 극초단파신호를 수신해 현재 위치를 파악한다.
Core Location 의 종류
1.GPS2.셀타워 삼각측량
- 전화기가 속한 영역의 셀타워 위치를 기반으로 한 계산을 통해 현재 위치를 판단한다.
도시나 셀타워가 촘촘히 서치된 영역에서는 정확도가 떨어진다.
Core Location 의 종류
1.GPS2.셀타워 삼각측량
3. WIFI 위치서비스 (WPS)
- 근처의 와이파이 접근 지점의 맥주소를 이용해 이미 알고있는 서비스 제공자의 대용량 데이터베이스와 서비스 제공자의 서비스 영역을 참조하여 위치를 추측한다.
정확하지 않으며 거리차가 몇마일까지 날수있다.
위치 관리자
코어 로케이션 API를 사용하는 방법은 쉽다.
코어 로케이션 매니저를 선언하고 그에 따른 옵션만 설정해주면된다.
CLLocationManager *locationManager = [[CLLocationManager alloc]init];
위치 관리자
하지만 여기서 이걸 선언한다고 위치 정보를 불러오는것은 아니다.
위치 관리자
하지만 여기서 이걸 선언한다고 위치 정보를 불러오는것은 아니다.
CLLocationManagerDelegate 프로토콜을 따르는 객체를 생성하고 이를 위치 관리자 델리게이트에 대입해야한다.
위치 관리자
하지만 여기서 이걸 선언한다고 위치 정보를 불러오는것은 아니다.
CLLocationManagerDelegate 프로토콜을 따르는 객체를 생성하고 이를 위치 관리자 델리게이트에 대입해야한다.
위치관리자는 위치정보를 사용하거나 위치정보가 변경될때마다 이런 델리게이트 메서드를 호출한다.
원하는 정확도 설정
현재 기기가 알아야할 정보가 일정국가의 도(경기도)나 시(서울) 정도만 아는걸로 충분하다면 굳이 다 보여줄 필요는 없다.
알아야 하는정도만 보여주면 된다.
원하는 정확도 설정
CLLocationManager *locationManager = [[CLLocationManager alloc]init]; locationManager .delegate = self;locationManager.desireAccuary = kCLLocationAccuracyBest;
원하는 정확도 설정
CLLocationManager *locationManager = [[CLLocationManager alloc]init]; locationManager .delegate = self;locationManager.desireAccuary = kCLLocationAccuracyBest; locationManager.desireAccuary에 10을 지정하면 10미터 반경 이내의 현재위치를 파악하려한다.
원하는 정확도 설정
CLLocationManager *locationManager = [[CLLocationManager alloc]init]; locationManager .delegate = self;locationManager.desireAccuary = kCLLocationAccuracyBest; locationManager.desireAccuary에 10을 지정하면 10미터 반경 이내의 현재위치를 파악하려한다.
위와 같이 kCLLocationAccuracyBest를 지정하면 코어 로케이션은 현재 사용 가능한 가장 정확한 방식을 사용한다.
원하는 정확도 설정
CLLocationManager *locationManager = [[CLLocationManager alloc]init]; locationManager .delegate = self;locationManager.desireAccuary = kCLLocationAccuracyBest; locationManager.desireAccuary에 10을 지정하면 10미터 반경 이내의 현재위치를 파악하려한다.
위와 같이 kCLLocationAccuracyBest를 지정하면 코어 로케이션은 현재 사용 가능한 가장 정확한 방식을 사용한다.
kCLLocationAccuracyBest외에도 kCLLocationAccuracyHundredMeters,
kCLLocationAccuracAccuracyKilomether,kCLLocationAccurayThreeKilometers가 있다.
거리 필터의 설정
기본적으로 위치관리자는 기기의 위치가 바뀌었음을 감지할때 마다 이를 델리게이트에게 알린다.
거리필터를 사용함으로써 모든 위치 변화를 알리지 않고 특정범위 이상으로 위치가 변경시만 이를 알리게끔할수있다.
이로써 얻을수있는 장점
거리 필터를 사용함으로써 애플리케이션의 위치 조회를 줄일수가 있다.
그럼 어떻게 사용할까?
거리필터또한 미터단위로 설정한다.
locationManager.distanceFilter = 1000.0f;1000미터 움직일시 위치정보를 가지고 오겟다는 얘기
위치관리자의 사용시작순서
1. 위치 조회를 시작할 준비가 됐을때
필터 없이 기본설정으로 쓸려면?
locationManager.distanceFilter = kCLDistanceFilterNone;
위치관리자의 사용시작순서
1. 위치 조회를 시작할 준비가 됐을때
2. 위치관리자에게 조회를 시작하도록 명령
위치관리자의 사용시작순서
1. 위치 조회를 시작할 준비가 됐을때
2. 위치관리자에게 조회를 시작하도록 명령
3 .위치관리자는 작업을 시작하고 현재위치를 파악한후
위치관리자의 사용시작순서
1. 위치 조회를 시작할 준비가 됐을때
2. 위치관리자에게 조회를 시작하도록 명령
3 .위치관리자는 작업을 시작하고 현재위치를 파악한후
4. 델리게이트 메서드를 호출한다.
위치관리자의 사용시작순서
1. 위치 조회를 시작할 준비가 됐을때
2. 위치관리자에게 조회를 시작하도록 명령
3 .위치관리자는 작업을 시작하고 현재위치를 파악한후
4. 델리게이트 메서드를 호출한다.
5. 작업을 멈추게 하기전까지 위치관리자는 현재 거리 필터범위를 초과하는 위치 변화가 있을때마다 델리게이트 메서드를 계속해서 호출한다.
위치관리자의 사용시작코드
[locationManager startUpdatingLocation];
위치관리자의 현명한 활용법
현재 위치만 판단하고 더이상 위치 정보가 필요 없다면 애플리케이션에서 필요한 정보를 델리게이트 메서드가 받자마자 델리게이트 메서드 내에서 위치관리자 작업을 중단하면된다.
위치관리자의 현명한 활용법
현재 위치만 판단하고 더이상 위치 정보가 필요 없다면 애플리케이션에서 필요한 정보를 델리게이트 메서드가 받자마자 델리게이트 메서드 내에서 위치관리자 작업을 중단하면된다.
그에 반해 지속적인 위치 조회가 필요하다면 가능한 한 빨리 위치조회를 멈추게끔 코드를 작성해야한다.
배터리 때문이다.
위치관리자의 현명한 활용법
위치 관리자가 델리게이트에서 위치 업데이트를 보내지 않게 하려면 다음과 같이 stopUpdatingLocation을 호출하면된다.
[locationManager stopUpdatingLocation];
위치관리자 델리게이트
위치 관리자 델리게이트는 항상 CLLocationManagerDelegate 프로토콜을 따라야 한다.
이 프로토콜에서는 두개의 메서드를 정희하는데 둘다 선택 메서드다.
위치관리자 델리게이트
위치 관리자 델리게이트는 항상 CLLocationManagerDelegate 프로토콜을 따라야 한다.
이 프로토콜에서는 두개의 메서드를 정희하는데 둘다 선택 메서드다.
1.위치관리자가 현재위치를 판단하거나
거리변화가 감지시 호출된다.
위치관리자 델리게이트
위치 관리자 델리게이트는 항상 CLLocationManagerDelegate 프로토콜을 따라야 한다.
이 프로토콜에서는 두개의 메서드를 정희하는데 둘다 선택 메서드다.
1.위치관리자가 현재위치를 판단하거나
거리변화가 감지시 호출된다.
2. 위치관리자가 에러시 호출
위치 업데이트 받기
현재 위치를 알려줄떄는 위치관리자가 locationManager:didUpdateToLocation:메서드를 호출한다.
이메서드는 세개의 매개변수를 받는다.
위치 업데이트 받기
현재 위치를 알려줄떄는 위치관리자가 locationManager:didUpdateToLocation:메서드를 호출한다.
이메서드는 세개의 매개변수를 받는다.
1. 이 메서드를 호출한 위치관리자.
위치 업데이트 받기
현재 위치를 알려줄떄는 위치관리자가 locationManager:didUpdateToLocation:메서드를 호출한다.
이메서드는 세개의 매개변수를 받는다.
1. 이 메서드를 호출한 위치관리자.
2. 기기의 현재위치를 정희한 CLLocation객체.
위치 업데이트 받기
현재 위치를 알려줄떄는 위치관리자가 locationManager:didUpdateToLocation:메서드를 호출한다.
이메서드는 세개의 매개변수를 받는다.
1. 이 메서드를 호출한 위치관리자.
2. 기기의 현재위치를 정희한 CLLocation객체.
3. 마지막 업데이트로부터 가져온 이전위치를 정의한 CLLocation객체
CLLocation을 활용한 위도와 경도
위치관리자는 CLLocation 인스턴스를 사용해 위치정보를 전달한다.
이 클래스에는 애플리케이션을 활용할수 있는 다섯가지 속성이 들어있다.
위도와 경도는 coordinate 라는 속성이 들어있다.
위도와 경도를 각도값으로 구하는 법
위도
CLLocationDegrees latitude = theLocation.coordinate.latitude; 경도
CLLocationDegrees longitude = theLocation.coordinate.longitude;
그외....
수중 깊이
CCLocationDegrees altitude = theLocation.altitude; 수중 깊이나 고도를 무시한 평행선상의 두좌표사이의거리
CCLocationDegrees distance = [fromLocation distanceFromLocation:toLocation];
에러 알림
현재 위치를 알릴수 없을때
locationManager:didFailWithError: 라는 두번쨰 델리게이트 메서드를 호출한다.
이런 에러의 주된 원인은 사용자의 위치정보 사용에 대한 동의를 얻어야 하기떄문이다.
동의를 구하기 위한 alert모달 창을 띄운다.
여기서 거부하면 위치 관리자는 kCLErrorDenied라는 에러코드와 더불어 locationManager:didFailWithError:를 사용해 델리게이트에게 이사실을 알려준다.
(WhereAmI)
소스코딩
WhereAmIViewController.h
WhereAmIViewController.m
WhereAmIViewController.m
DelegateMethod - 위치정보 셋팅
DelgateMethod - 에러 처리
Q&A
감사합니다.