디바이스의 지리적 위치를 얻어올 수 있는 기능을 제공해주는 Framework
Core location은 디바이스의 지리적 위치, 고도, 방향, 그리고 아이비컨과의 상대적 위치를 알려주는 프레임 워크 입니다. 해당 프레임워크는 이런 지리적 정보를 wifi, 셀룰러데이터, gps, bluetooth,등과 같은 통신망을 통해 해당 정보를 얻을 수 있다고 해요.
CLLocationManager
클래스의 인스턴스를 활용해서 Core location 서비스를 세팅, 시작, 그리고 정지할 수 있다고 해요.
위치 관련된 이벤트를 시작 또는 정지할 수 있는 객체
아래와 같은 위치기반 활동을 지원합니다:
delegate를 특정한 객체(대부분 viewcontroller)에게 위임 하는 방식으로 CLLocationManager를 사용할 수 있다고 공식문서에 적혀있는 것 같아요(그럼 ViewController는 CLLocationManagerDelegate
를 채택하고 있어야 겠죠?)
Core Location 프레임워크는 View Controleler의 CLLocationManager 관련된 메서드를 CLLocationManager가 초기화 되는 시점에서 호출한다고 합니다.
문서를 읽긴 했지만 어떻게 사용해야 할까 막막하던 찰나에 역시 애플!! 친절하게 사용법도 알려주네요!
위에서 계속 얘기 했던데로 CLLocationManager의 객체를 생성해야 합니다. 해당 인스턴스는 강한 참조로 이루어져있어야 하고 지역변수로 선언하면 부적합하다네요. 그 이유는 모든 location manager 객체들은 비동기적으로 작업을 처리하기 때문에 지역변수로 선언하는 것은 불충분하다고 합니다.
위에 얘기했던 view controller의 위임 작업 역시 그 어떠한 지역 서비스가 시작되기 전에 해주어야 합니다.
위치 서비스가 사용불가능 할 경우 실패와 관련된 메서드를 사용하여야 합니다. 예를 들면 지역 모니터 서비스가 사용불가인 경우 CCLocation Manager 객체는 locationManager(_: monitoringDidFailFor:withError:)
메서드를 호출해서 에러 처리를 해주어야 합니다. 경우에 따라 특정한 위치 서비스가 사용 불가일 때 UI 또한 업데이트 해주어야 합니다.
앱에 해당되는 권한 설정을 해줘야 하네요. 위치 기반 기능을 앱에서 실행할 때 유저에게 위치권한을 물어보게 하면 됩니다.
location manager 객체가 생성될 때 바로 불리는 locationManager(_:didChangeAuthorization:)
에서 아래와 같은 작업을 해 줄수 있습니다.
해당 메서드를 활용하여 앱 권한 변경에 대응할 수 있고 변화에 따른 추가 조치를 취할 수 있습니다.
위임객체를 먼저 구현한 뒤
위치 세팅을 통해서 더 정확한 서비스를 받을 수 있습니다. Core Location은 배터리관리를 적즉적으로 하는데요. 예를 들면 위치 서비스의 정확도를 1km 이내로 설정하면 gps 사용을 종료 시키고 wifi와 같은 배터리 소모가 비교적 적은 통신 장치를 사용하게되고 이는 배터리 절약에 기여합니다.
import UIKit
import CoreLocation
class KarrotMarketHomeViewController: UIViewController {
private var locationManager: CLLocationManager?
override func viewDidLoad() {
super.viewDidLoad()
setUpLocationManager()
}
private func setUpLocationManager() {
locationManager = CLLocationManager()
locationManager?.requestWhenInUseAuthorization()
}
}
Core Location을 먼저 import 해 오는 것부터 시작 해야 합니다.
분명 이렇게 설정만 해도 locationManager의 requestWhenInUseAutorization()
메서드만 호출하면 위치정보 처리는 불가능 하더라도..위치권환 메세지는 떠야 하는데 뜨지 않네요...왜 그럴까요..
문서를 잘 읽어봐야 합니다;
해당 메서드를 들어가서 조금만 자세히 읽어보니 아래와 같은 문장이 있더라구요:
The user prompt contains the textfrom the NSLocationWhenInUseUsageDescription key in your app
Info.plist
, and the presence of that key is required when calling this method.
Info.plist
설정을 안 해줘서 그렇군요.. 그럼 바로 설정을 해 봅시다.
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>가까운 동네를 검색하거나 동네인증을 위해 현재 위치를 확인합니다.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>가까운 동네를 검색하거나 동네인증을 위해 현재 위치를 확인합니다.</string>
항상 허용인 경우 그리고 앱 실행 중 허용인 경우 모두 key와 value를 추가 해 주었습니다.
그렇게 해 보니.. 두구두구~!!
드디어 반가운 위치권한 팝업창이 보이네요!
override func viewDidLoad() {
super.viewDidLoad()
locationManager?.delegate = self
setUpLocationManager()
}
extension KarrotMarketHomeViewController: CLLocationManagerDelegate {
}
ViewController를 locationManager의 대리자로 위임하는 작업을 통해서 받아온 지역정보를 가지고 다음 작업을 할 수 있게 되었습니다!
[참고]:
Apple Developer Document | Core Location
Apple Developer Document | CLLocationManager
Apple Developer Document | Adding Location Services to Your App