[iOS] Core Location 사용 위치 정보 얻기

2020. 8. 19. 23:05iOS

반응형

이번에 공모전을 준비하며 개발을 하다보니 iPhone을 기반으로 위치를 얻어와서 지도에 표시해야하는 작업이 있었어요.

 

찾아 보니, iOS 기본 Framework에서 제공하는 기능이 있더라구요‼️

기본으로 제공하는 Framework을 이용해서 현재 자기의 위치를 받아오는 작업을 해보겠습니다.

 

우선 여러분들 혹시 iOS Architecture에 대해 알고계시나요⁉️

혹시 위와 같은 그림을 보신적 있으신가요?
우선 위치 정보를 iPhone에서 얻어오기 전에 어떤 Framework을 사용해야하는지 알아야할 것 같아요‼️

우선 저희가 사용해야할 Core LocationCore Service 계층에 속해있답니다.

그렇다면 각각의 계층에 대해 간단히 어떤 Framework가 있고 어떤 역할을 하는지 알아볼게요.

✔️ Cocoa Touch

  • 화면의 그래픽 UI 및 터치의 기능을 제공하는 Framework
  • UIKit, MapKit, MessageUI

 

✔️ Media

  • 그래픽이나 오디오, 비디오 등 멀티미디어의 기능을 제공하는 Framework
  • AvFoundation, MediaPlayer, Core Animation, Core Graphics

 

✔️ Core Service

  • GPS 나침반, 가속도 센서나 자이로스코프 센서와 같이 디바이스의 하드웨어 특성에 기반한 서비스 제공
  • Core Location, Core Data, Core Motion, Foundation

 

✔️ Core OS

  • 하드웨어와 가장 가까이 있는 최하위 계층
  • C 기반의 저수준의 API로 이루어져 있음.
  • 커널, 파일 시스템, 전원 관리, 디바이스 드라이버 등이 포함


잘보면 계층에서 아래에서 위로 갈수록 사용자 친화적이고, 아래로 갈수록 하드웨어적인 것을 알 수 있습니다.
그렇다면 오늘 사용해볼 Core Location에 대해 더 자세히 알아볼게요.

 

 

Core Location 란?

기본적으로 iPhone Device의 위치를 얻어올 수 있는 기능들을 제공해주는 Framework라고 알면 될 것 같습니다.

 

Core Locatio을 이용하면 iPhone Device의 위치를 알 수 있습니다. 여기서 위치란 지리적 위치, 고도 및 방향 또는 근처 iBeacon 장치를 기준으로 한 위치를 뜻한다. 

 

그렇다면 정보를 얻어올 때, Core Location에서는 어떤 방식으로 iPhone 기기의 위치를 얻어올까요?

애플 개발자 문서에 따르면 Wi-fi, GPS, Bluetooth, magnetometer, barometer, celluar hardware을 이용해서 정보를 모은다고 명시되어 있습니다.

 

Core Location의 기능을 사용하기 위해서 꼭 사용해야 하는 클래스가 있습니다.

바로 CLLocationManager 인스턴스 입니다.

 

그렇다면 CLLocationManager을 이용해서 우리가 할 수 있는 기능들은 어떤 것이 있을까요?

 

  • 사용자의 크고 작은 위치 변화를 감지할 수 있고 크고 작은 위치 변화의 척도를 제공합니다.
  • 어떤 지역을 설정하고 사용자가 지역에 들어가거나 나갈 때의 상황을 감지할 수 있습니다.
  • 주변 Beacon을 감지한다. (이 부분은 어떤 부분인지 잘 감이 안옵니다.... 아시는 분 알려주세요)
  • 현재 사용자의 나침반 방향을 알 수 있습니다.

 

다음 기능들을 활용하면 지도 기반의 앱을 만들 때, 유용하게 쓸 수 있겠죠⁉️

 

 

Core Location 사용하기

여러분들 위치 기반의 앱을 사용하기 전에 권한을 물어보던 화면 생각나시나요⁉️

 

위치 정보를 사용하기 위해서는 꼭 사용자에게 위치 정보를 사용할건지 물어야합니다.

 

물어보기 이전에 Info.plist에서 위치 권한을 허용해주는게 필수 작업입니다. 

// 항상 위치 정보 제공에 동의할 경우
Privacy - Location Always and When In Use Usage Description
// 앱을 사용하는 동안만 위치 정보 제공에 동의할 경우
Privacy - Location When In Use Usage Description

다음과 같은 Key 값을 Info.plist에 추가해주셨으면, 위치 기반 정보를 사용할 준비가 끝이 났습니다.

 

 

✔️CLLocationManager 인스턴스 생성하기

class MapVC: UIViewController {
	let locationManager: CLLocationManager?

	override func viewDidLoad() {
    	// locationManager 인스턴스를 생성
    	locationManager = CLLocationManager()
        
        // 앱을 사용할 때만 위치 정보를 허용할 경우 호출
        locationManager.requestWhenInUseAuthorization()
        
        // 위치 정보 제공의 정확도를 설정할 수 있다.
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        
        // 위치 정보를 지속적으로 받고 싶은 경우 이벤트를 시작
        locationManager.startUpdatingLocation()
    }
}

다음과 같이 CLLocationManager의 인스턴스를 생성해주고 사용자에게 위치 정보를 사용할 것이라고 알려야합니다.

desiredAccuracy 프로퍼티를 이용해 위치 정보 제공의 정확도 역시 설정해 줄 수 있습니다.

iOS, MacOS에서는 kCLLocationAccuracyBest가 Default 값으로 지정이 되어 있습니다.

 

 

✔️ CLLocationManager 이용 위치 정보 받아오기

class MapVC: UIViewController {
	override func viewDidLoad() {
    	// 기존에 생성했던 CLLocationManager 인스턴스에 delegate 지정
        locationManager.delegate = self
    }
}

// locations에 사용자의 위치 정보가 들어옴. 위도, 경도
extension MapVC: CLLocationManagerDelegate {
	func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let coordinate = locations.last?.coordinate {
        	print(coordinate.latitude)
       		print(coordinate.longitude)
        }
    }
}

위까지의 설정을 모두 마치게 되면 위치를 받을 준비가 모두 끝나고 사용자의 위치 정보를 받아올 수 있습니다.

 

더 다양한 기능들이 있지만, Core Location을 이용해서 위치 정보를 받아오는 것까지만 진행해보았습니다.

 

궁금한 점이나 틀린 것이 있으면 언제든지 댓글 달아주세요 🙏

반응형