iOS

iOS ) 현재 위치 가져오기

snowe 2020. 12. 24. 18:13

안녕하세요:)  오늘은 위치 권한을 요청받고 현재 사용중인 기기의 위치 정보를 가져오는 방법에 대해서 알아보겠습니다.

 

💡 주의사항

시뮬레이터로 실행 시 현재 위치가 아닌 샌프란시스코가 나오더라구요? 아마 시뮬레이터 특성 상 생기는 문제인 듯 합니다
그래서 저는 제 아이폰을 사용해서 진행하였으니 참고해주세요!!

 

가장 먼저 해주어야 할 것은 info.plist의 수정입니다.

 

info.plist - Information Property List 아래에 사용 용도에 따라 추가해주시면 됩니다!

 

Privacy - Location When In Use Usage Description - 앱이 사용중일때만 가져오기

Privacy - Location Always and When In Use Usage Description - 앱을 사용안해도 항상 가져오기

info.plist

그리고 해주어야 할 것은 CoreLocation의 import와 CLLocationManagerDelegate 프토토콜의 선언입니다.

import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {
        //code
}

CoreLocation은 무엇이고 CLLocationManagerDelegate는 또 뭘까요?

 

📌 CoreLocation

Obtain the geographic location and orientation of a device(기기의 지리적 위치와 방향을 얻는다).

 

📌 CLLocationManagerDelegate

The methods that you use to receive events from an associated location manager object(location manager 객체와 관련된 것들로 부터 이벤트를 받아올 때 사용된다).

 

📌 Location manager

You use instances of this class to configure, start, and stop the Core Location services(이 클래스의 인스턴스들은 Core Location 서비스들을 시작하고 멈추고 구성하기 위해 사용된다).

 

 

자 뭔지 대충 알았으면 이제 사용을 해봐야겠죠?

 

다음은 전체 코드입니다 하나씩 보면서 설명을 해볼게요. (값을 출력해보는 건 밑에서 따로 다루겠습니다!)

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {
    var locationManager: CLLocationManager!
    var latitude: Double?
    var longtitude: Double?
     
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        // CLLocationManager클래스의 인스턴스 locationManager를 생성
        locationManager = CLLocationManager()
        locationManager.delegate = self
        
        // 포그라운드일 때 위치 추적 권한 요청
        locationManager.requestWhenInUseAuthorization()
        
        // 배터리에 맞게 권장되는 최적의 정확도
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        
        // 위치 업데이트
        locationManager.startUpdatingLocation()
        
        // 위,경도 가져오기
        let coor = locationManager.location?.coordinate
        latitude = coor?.latitude
        longtitude = coor?.longitude
    }
}

 

먼저 이 부분,

 

// CLLocationManager클래스의 인스턴스 locationManager를 생성
locationManager = CLLocationManager()
locationManager.delegate = self

아까 Location manager 설명을 드릴 때 "이 클래스의 인스턴스들은 Core Location 서비스들을 시작하고 멈추고 구성하기 위해 사용된다." 라고 했죠? 따라서 이제 우리가 생성한 locationManager 인스턴스를 가지고 활용할 겁니다.

 

// 포그라운드일 때 위치 추적 권한 요청
locationManager.requestWhenInUseAuthorization()

다음입니다. 포그라운드(fore-ground)라는 것은 '앱이 화면상에 나와 있을 때'를 의미합니다.

위치 권한 요청

이런식으로 권한을 요청하게 되죠

 

그 다음 줄 부터는 한번에 보겠습니다!

// 배터리에 맞게 권장되는 최적의 정확도
locationManager.desiredAccuracy = kCLLocationAccuracyBest
        
// 위치 업데이트
locationManager.startUpdatingLocation()

kCLLoactionAccuracyBest 가 보이시나요?  위치 데이터의 정확도로 iOS, macOS는 kCLLoactionAccuracyBest를 사용하게 됩니다.

(watchOS는 디폴트 값이 iOS, macOS와 다르게 kCLLoactionAccuracyhundredMeters라고 합니다. 참고하세요!!)

 

그리고 나서 startUpdatingLocation() 메소드를 통해 위치에 대한 업데이트를 시작하며 현재 위치의 위도, 경도를 즉각적으로 return해줍니다.

(여기서 startUpdatingLocation()의 값이 전달 된 후에는 stopUpdatingLocation() 메소드를 호출해서 불필요한 업데이트를 멈춰주는 게 좋다고 하네요~~)

 

자 이제 위치 정보를 활용해봐야겠죠??

 

저는 두 가지 방법을 사용해보았는데요 

 

방법 1

 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location = locations[locations.count - 1]
        print(location)
    }

메소드를 통해 업데이트 된 위치 정보가 담긴 locations 배열이 넘어오고 그 배열에서 가장 최근 값을 location에 담아 출력 해줌

 

방법 2

  // 위,경도 가져오기
  let coor = locationManager.location?.coordinate
  latitude = coor?.latitude
  longtitude = coor?.longitude
}

@IBAction func touchUpInside(_ sender: Any) {
        print(latitude ?? 0, longtitude ?? 0)
    
    }

버튼을 클릭하면 현재 위치의 위도, 경도가 표시

 

 

로그를 출력해보면

위에 두줄이 방법1 / 밑에 한 줄이 방법2 입니다

방법1은 일정한 간격으로 계속해서 출력이 되고 방법2의 경우 버튼 클릭시 출력을 하게 해두었기 때문에 버튼 클릭시에만 출력이 됩니다!

 

오늘은 여기까지입니다. 감사합니다😊

참고한 자료

Swift 현재 위치 주소 가져오기
CoreLocation 위치 파악하기