[iOS] Framework - Core Location

Inwoo Hwang·2021년 8월 26일
1

iOS

목록 보기
12/13
post-thumbnail
post-custom-banner

Core Location


디바이스의 지리적 위치를 얻어올 수 있는 기능을 제공해주는 Framework

Core location은 디바이스의 지리적 위치, 고도, 방향, 그리고 아이비컨과의 상대적 위치를 알려주는 프레임 워크 입니다. 해당 프레임워크는 이런 지리적 정보를 wifi, 셀룰러데이터, gps, bluetooth,등과 같은 통신망을 통해 해당 정보를 얻을 수 있다고 해요.

CLLocationManager 클래스의 인스턴스를 활용해서 Core location 서비스를 세팅, 시작, 그리고 정지할 수 있다고 해요.

CLLocationManager는 뭐지...

위치 관련된 이벤트를 시작 또는 정지할 수 있는 객체

아래와 같은 위치기반 활동을 지원합니다:

  • 사용자의 현재 위치의 변화를 추적합니다
  • 나침반의 변화를 알려줍니다
  • 특정한 지역에 진입하거나 떠날 때를 모니터한 뒤 필요한 위치기반의 이벤트를 생성합니다
  • 근처의 연결 가능한 비컨을 알려줍니다.

delegate를 특정한 객체(대부분 viewcontroller)에게 위임 하는 방식으로 CLLocationManager를 사용할 수 있다고 공식문서에 적혀있는 것 같아요(그럼 ViewController는 CLLocationManagerDelegate 를 채택하고 있어야 겠죠?)

Core Location 프레임워크는 View Controleler의 CLLocationManager 관련된 메서드를 CLLocationManager가 초기화 되는 시점에서 호출한다고 합니다.

이걸 어떻게 활용해야 하지...

Adding Location Services to Your App

문서를 읽긴 했지만 어떻게 사용해야 할까 막막하던 찰나에 역시 애플!! 친절하게 사용법도 알려주네요!

Create the Location Manager and Delegate

위에서 계속 얘기 했던데로 CLLocationManager의 객체를 생성해야 합니다. 해당 인스턴스는 강한 참조로 이루어져있어야 하고 지역변수로 선언하면 부적합하다네요. 그 이유는 모든 location manager 객체들은 비동기적으로 작업을 처리하기 때문에 지역변수로 선언하는 것은 불충분하다고 합니다.

위에 얘기했던 view controller의 위임 작업 역시 그 어떠한 지역 서비스가 시작되기 전에 해주어야 합니다.

Handle Errors in the Delegate Methods

위치 서비스가 사용불가능 할 경우 실패와 관련된 메서드를 사용하여야 합니다. 예를 들면 지역 모니터 서비스가 사용불가인 경우 CCLocation Manager 객체는 locationManager(_: monitoringDidFailFor:withError:) 메서드를 호출해서 에러 처리를 해주어야 합니다. 경우에 따라 특정한 위치 서비스가 사용 불가일 때 UI 또한 업데이트 해주어야 합니다.

Ask for Authorization and Handle Changes

앱에 해당되는 권한 설정을 해줘야 하네요. 위치 기반 기능을 앱에서 실행할 때 유저에게 위치권한을 물어보게 하면 됩니다.

location manager 객체가 생성될 때 바로 불리는 locationManager(_:didChangeAuthorization:) 에서 아래와 같은 작업을 해 줄수 있습니다.

해당 메서드를 활용하여 앱 권한 변경에 대응할 수 있고 변화에 따른 추가 조치를 취할 수 있습니다.

Start Location Services and Receive Events

위임객체를 먼저 구현한 뒤

  • CLLocationManager의 적절한 메서드를 호출하여 이벤트전달을 시작해야 합니다.
  • 위임객체가 위치와 방향과 관련된 업데이트를 받게 합니다.
  • CLLocation Manager의 적절한 메서드를 호출하여 사용하고자 하는 앱의 위치 서비스를 중지 시킬 수 있습니다.

위치 세팅을 통해서 더 정확한 서비스를 받을 수 있습니다. 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를 추가 해 주었습니다.

그렇게 해 보니.. 두구두구~!!

simulator_screenshot_FCBD89BF-AC2E-4440-AE56-F83E67ECE366

드디어 반가운 위치권한 팝업창이 보이네요!

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

profile
james, the enthusiastic developer
post-custom-banner

0개의 댓글