# iOS | Swift/--- 공식 문서

iOS CoreLocation__ 위치 서비스 사용하기

jiniz.ll 2022. 7. 5. 16:31

CLLocationManager

Core Location Service를 설정하고 시작하고 중지하기 위해 사용합니다.

 

이를 통해서 다음과 같은 작업을 할 수 있습니다.

  • 사용자의 현재 위치에서 크거나 작은 변화를 추적
  • 나침반에서 방향 변경 추적
  • 사용자 위치 기반 이벤트 생성
  • 근거리 데이터 통신기기(Bluetooth Beacon)와 통신

Location manager 를 생성하면 시스템은 그 즉시 locationDidChangeAuthorization() 메서드를 호출하고,

또한 앱의 권한이 변경되면 delegate 는 모든 위치 및 방향과 관련된 업데이트와 이벤트를 처리합니다.

 

 

앱에 위치 서비스를 추가하고 앱을 실행하였을 때,

  • 기기가 위치 서비스를 지원하는지 확인하고
  • 원하는 위치 서비스를 구성하고 시작하며
  • 사용자의 위치를 수신할 수 있는 권한을 요청해야 합니다.

인증이 완료되면 앱이 요청하는 Core Loctaion 서비스에 대한 위치 이벤트를 수신합니다.

 

사용자의 기기가 위치 서비스를 지원하는지 확인하는 방법은 다음 메서드를 호출하여 반환값이 false 인 경우 그 기기가 특정 서비스를 지원하지 않음을 확인할 수 있습니다.

만약 특정 서비스를 지원하지 않는다면 앱의 Info.plist에 해당 서비스에 대한 요구사항을 표시해야 합니다.

 Requiring the Presence of Specific Location Services 참고

significantLocationChangeMonitoringAvailable() 사용자의 위치에서 변화를 추적할 수 있는지 체크
isMonitoringAvailable(for:) 지리적 영역이나 비콘 영역에 진입하거나 나가는 것을 감지하기 위한 영역 모니터링을 지원하는지 체크
headingAvailable() 나침반 관련 방향을 제공하는지 체크
isRangingAvailable() 근처 iBeacon 장치와의 상대적인 거리를 구할 수 있는지 체크

 

Location Manager와 Delegate 생성하기

CLLocationManager 인스턴스를 생성하고 강한 참조를 사용합니다.

Location manager 객체는 관련된 모든 작업이 완료될 때까지 강한 참조가 유지되어야 합니다.

그 이유는 location manager 작업은 비동기적으로 실행되기 때문에 그것을 지역변수로 저장하는 것만으로는 충분하지 않습니다.

 

delegate 는 어떤 위치 서비스를 시작하기 전에 할당하며

시스템은 해당 위치 서비스를 시작한 서비스에서 delegate 객체의 메서드를 호출합니다.

해당 스레드 자체에는 앱의 메인 스레드에서 발견되는 것과 같은 활성 실행 루프(run loop)가 있어야 합니다.

 

 

Delegate 메서드에서 에러 처리하기

기기에서 위치 서비스를 사용할 수 없을 때 정상적으로 실패할 수 있도록 delegate 에 오류 관련 메서드를 구현합니다.

사용할 수 없는 서비스를 시작하려고 하면 CLLocationManager 객체는 delegate의 실패 관련 메서드 중 하나를 호출합니다.

예를 들어 지역 모니터링을 사용할 수 없는 경우, 객체는 locationManager(_:monitoringDidFailFor:withError:) 메서드를 호출합니다. 특정 위치 서비스를 사용할 수 없는 경우에는 앱에서 UI를 업데이트할 수 있습니다.

 

 

권한을 요청하고 변경사항 처리하기

해당 앱에 대한 권한 상태를 결정해야 하는데 사용자가 앱에서 위치 관련 기능에 액세스 할 때 위치 서비스를 사용할 수 있는 권한을 요청하면 됩니다.

Choosing the Location Services Authorization to Request 참고

 

Location manager 를 생성했거나 앱의 권한 상태를 변경했을 때 시스템이 호출하도록 locationManager(_:didChangeAuthorization:) 을 구현할 수 있습니다.

이 메서드를 사용하면 앱의 권한 상태가 변경되었을 때 반응할 수 있고 각 상태에 대해 적절한 작업을 수행하도록 할 수 있습니다.

예로, 권한이 변경될 때 앱의 위치 기능을 적절히 설정하거나 해제할 수 있습니다.

 

 

위치 서비스를 시작하고 이벤트 받기

LocationManager 인스턴스에 delegate 를 설정하였으면 다음을 수행해야 합니다.

  • CLLocationManager에서 적절한 메서드를 호출하여 이벤트 전달을 시작합니다.
  • 연결된 위임 객체에서 위치 및 방향 관련 업데이트 정보를 받습니다.
  • 앱이 더이상 위치 이벤트를 받을 필요가 없다면 서비스를 중지하기 위해 CLLocationManager에서 적절한 메서드를 호출합니다.

사용하는 서비스를 위해 해당 서비스와 관련된 모든 속성을 정확히 구성하는 것이 좋습니다.

Core Location은 필요하지 않을 때 하드웨어를 꺼서 전력을 적극적으로 관리합니다. 예를 들어 위치 이벤트에 대한 원하는 정확도를 1km 로 설정하면 location manager는 GPS 하드웨어를 끄고 WiFi 또는 셀 라디오에만 의존할 수 있는 유연성이 제공되기 때문에 상당한 전력 절감 효과를 얻을 수 있습니다.

 

 

 

REFERENCE