거의 모든 애플리케이션이 위치 서비스를 활용하고 있기 때문에, iOS 개발자라면 위치 관련 기능에 대한 깊이 있는 이해가 필수적입니다. 이 글에서는 CLLocationManager를 사용하여 사용자의 현재 위치 위도(latitude)와 경도(longitude)를 가져오는 방법을 단계별로 알아보겠습니다.
CLLocationManager에 대한 자세한 내용은 Apple 공식 개발자 문서에서 확인할 수 있습니다.
이번 튜토리얼에서는 앱 실행 시 viewDidLoad 메서드에서 사용자의 위도와 경도를 출력하는 샘플 앱을 만들어 보겠습니다. 필요에 따라 버튼 탭 이벤트나 UILabel에 표시하는 방식으로 응용할 수도 있습니다.
프로젝트 설정하기
1단계: Xcode 프로젝트 생성
Xcode를 열고 New Project → Single View Application을 선택한 후, 프로젝트 이름을 "Location"으로 지정합니다.
2단계: info.plist에 권한 키 추가
위치 정보를 사용하려면 반드시 사용자의 허가를 받아야 합니다. info.plist 파일에 아래 키들을 추가하세요.
<key>NSLocationWhenInUseUsageDescription</key>
<string>앱이 사용자의 위치 정보를 사용하려고 합니다</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>앱이 사용자의 위치 정보를 사용하려고 합니다</string>
위 키들은 위치 관련 기능을 구현할 때 필수적인 요소로, 사용자에게 위치 접근 권한을 요청하는 용도로 사용됩니다. 이 설명 문구는 실제 권한 요청 팝업창에 표시되므로, 사용자가 이해하기 쉽게 작성하는 것이 좋습니다.
코드 구현하기
3단계: CoreLocation 프레임워크 임포트
ViewController.swift 파일 상단에 CoreLocation을 import합니다.
import CoreLocation
4단계: CLLocationManager 객체 생성
위치 정보를 관리할 CLLocationManager 인스턴스를 생성합니다.
var locationManager = CLLocationManager()
5단계: viewDidLoad 메서드에 코드 작성
viewDidLoad 메서드 안에 아래 코드를 작성하여 위치 권한을 요청하고 좌표를 출력합니다.
locationManager.requestWhenInUseAuthorization()
var currentLoc: CLLocation!
if(CLLocationManager.authorizationStatus() == .authorizedWhenInUse ||
CLLocationManager.authorizationStatus() == .authorizedAlways) {
currentLoc = locationManager.location
print(currentLoc.coordinate.latitude)
print(currentLoc.coordinate.longitude)
}
여기서 requestWhenInUseAuthorization()은 앱이 포그라운드(화면에 활성화된 상태)에 있을 때만 위치 서비스를 사용할 수 있도록 권한을 요청하는 메서드입니다.
전체 코드
6단계: 앱 실행 및 결과 확인
앱을 빌드하고 실행하면 콘솔에 위도와 경도가 출력됩니다. 참고를 위해 전체 코드를 정리하면 다음과 같습니다.
import UIKit
import CoreLocation
class ViewController: UIViewController {
var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.requestWhenInUseAuthorization()
var currentLoc: CLLocation!
if(CLLocationManager.authorizationStatus() == .authorizedWhenInUse ||
CLLocationManager.authorizationStatus() == .authorizedAlways) {
currentLoc = locationManager.location
print(currentLoc.coordinate.latitude)
print(currentLoc.coordinate.longitude)
}
}
}
마무리 및 참고 사항
실제 개발 환경에서는 몇 가지 추가로 고려해야 할 사항이 있습니다. 첫째, 시뮬레이터에서는 기본 위치가 Apple 본사(쿠퍼티노)로 설정되어 있으므로, Xcode의 Debug 메뉴에서 Location 옵션을 변경하여 다양한 위치를 테스트할 수 있습니다. 둘째, 권한 승인 결과는 비동기적으로 반환되므로, 실무에서는 CLLocationManagerDelegate 프로토콜을 채택하여 didChangeAuthorization 메서드에서 권한 상태 변화를 처리하는 것이 더 안정적입니다. 셋째, iOS 14 이상에서는 authorizationStatus가 인스턴스 프로퍼티로 변경되었으니 최신 SDK를 사용한다면 이 부분도 함께 확인해 보세요.