"Get regular location updates based on the parameters you specify."
구체화한 파라미터에 기반해 주기적인 위치 업데이트를 가져옵니다.
위치 업데이트에 대해 가장 높은 수준의 제어가 필요한 경우 표준 위치 서비스를 사용할 수 있습니다. 이 서비스는 고수준으로 설정 가능하며, 이는 위치에 대한 선호하는 위치에 대한 정확도 및 새 업데이트 전달 전 사용자가 움직이여야 하는 거리를 구체화할 수 있도록 해줍니다. 이 서비스는 네비게이션 앱처럼 가장 높은 수준의 정확한 위치 혹은 주기적인 업데이트를 요구하는 앱에서 가장 많이 사용됩니다. 높은 수준의 정확도를 제공하기 때문에 서비스는 다른 위치 서비스에 비해 많은 전력을 소비합니다.
Note
표준 위치 서비스는 권한을 요구합니다. 이에 대한 더 많은 정보는 Requesting Authorization for Location Services를 보시기 바랍니다.
Requesting Authorization for Location Services
<>
표준 위치 서비스를 시작하려면 CLLocationManager
객체를 설정하고 이 객체의 startUpdatingLocation()
메소드를 호출해야 합니다. 위치 매니저는 딜리게이트의 locationManager(_:didUpdateLocations:)
메소드에 업데이트를 전달합니다.
원문에서 "locationManager(_:didUpdateLocations:) manager"라고 되어 있으나 다른 위치 서비스 글에서 "locationManager(_:didUpdateLocations:) method"라고 나와 있는 것을 보아 잘못되었다고 판단해 "locationManager(_:didUpdateLocations:) 메소드"로 번역했습니다.
전력 소비를 최소화하려면 실제로 필요한 것보다 더 높은 수준의 정확도로 desiredAccuracy
속성을 설정하지 않아야 합니다. 유사하게 항상 앱의 요구사항을 충족시킬 수 있는 수준의 가장 높은 값으로 distanceFilter
속성을 설정해야 합니다. 시스템은 항상 사용할 수 있는 최선의 위치 데이터를 제공하려고 노력할 것이지만, 이 속성들은 필요하지 않은 경우의 하드웨어 요소를 끌 수 있도록 하는 유연함을 시스템에게 제공할 것입니다. 예를 들어 kCLLocationAccuracyKilometer
에 원하는 정확도를 설정하면 시스템은 GPS를 비황성화 하고 와이파이 하드웨어만 사용할 것이며, 이는 전력을 절약하면서도 요청한 것에 비해 더 높은 정확도를 제공할 것입니다.
전력을 절약하는 다른 방법은 위치 매니저 객체의 pausesLocationUpdatesAutomatically
속성을 true
로 설정하는 것입니다. 이 속성을 설정하는 것은 사용자가 움직이지 않을 가능성이 높을 때 시스템이 위치 하드웨어를 비활성화 함으로써 전력 소비를 줄일 수 있도록 해줍니다. 예를 들어 사용자가 네비게이션 앱을 사용하는 동안 식사를 위해 멈추는 경우 시스템은 사용자가 다시 움직일 때까지 GPS 하드웨어를 끌 것입니다. 업데이트를 일시정지하는 것은 업데이트의 품질을 감소시키지 않지만, 위치 매니저의 activityType
속성에 적합한 값을 할당해야 합니다.
Note
위치 데이터가 더 이상 필요하지 않은 경우 항상 위치 매니저 객체의stopUpdatingLocation()
메소드를 호출해야 합니다. 위치 업데이트를 중단하지 않으면 시스템은 앱에 위치 데이터 전달을 계속하며, 이는 사용자 기기의 배터리를 소모합니다.
표준 위치 서비스를 시작하는 경우 최근에 캐시된 값이 딜리게이트로 즉시 알려집니다. 새 위치 데이터를 가져오면 위치 매니저는 업데이트된 값과 함께 딜리게이트의 locationManager(_:didUpdateLocations:)
메소드를 호출합니다. 위치 파라미터는 항상 적어도 하나의 위치를 포함하며, 둘 이상을 포함하고 있을 것입니다. 위치는 항상 결정되었던 순서대로 알려집니다. 그렇기 때문에 가장 최근의 위치는 항상 배열에서 가장 마지막 아이템입니다. Listing 1에서 보이는 것과 같습니다.
Listing 1 Processing the most recent location update
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let lastLocation = locations.last!
// Do something with the location.
}
위치 값을 사용하기 전에 CLLocation
객체의 타임스탬프를 확인해야 합니다. 시스템은 캐시된 위치를 반환할 것이기 때문에 타임스탬프를 확인하는 것은 인터페이스를 즉시 업데이트할지 혹은 새 위치를 기다릴지를 알 수 있도록 해줍니다.
위치 매니저가 위치 업데이트를 전달할 수 없을 때 위치 매니저는 딜리게이트 객체의 locationManager(_:didFailWithError:)
메소드를 호출합니다. 발생하는 모든 오류를 처리하기 위해 항상 이 딜리게이트 메소드를 구현해야 합니다. 예를 들어 사용자가 앱의 위치 서비스 사용에 대한 권한을 거부한 경우 이 메소드가 호출됩니다. 이와 같은 시나리오에서 위치 관련 기능을 비활성화하길 원할 것이며, 사용자에게 어떤 기능이 사용 불가능한지 알려주길 원할 것입니다. 이전에 시작했던 모든 서비스 역시 중단시켜야 하며, Listing 2에서 보이는 것과 같습니다.
Listing 2 Stopping location services when authorization is denied
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
if let error = error as? CLError, error.code == .denied {
// Location updates are not authorized.
manager.stopUpdatingLocation()
return
}
// Notify the user of any errors.
}
위치 업데이트를 가장 효율적인 방법으로 가져오지만, 다른 서비스에 비해 덜 빈번하게 가져옵니다.
https://developer.apple.com/documentation/corelocation/getting_the_user_s_location/using_the_visits_location_service
https://velog.io/@panther222128/Using-the-Visits-Location-Service
전력 소비를 절약할 수 있는 방법으로 위치 업데이트를 가져오지만, 표준 위치 서비스에 비해 덜 빈번하게 가져옵니다.
https://developer.apple.com/documentation/corelocation/getting_the_user_s_location/using_the_significant-change_location_service
https://velog.io/@panther222128/Using-the-Significant-Change-Location-Service
로케이션 관련 이벤트에 응답하기 위해 백그라운드 실행 모드를 활용합니다.
https://developer.apple.com/documentation/corelocation/getting_the_user_s_location/handling_location_events_in_the_background
https://velog.io/@panther222128/Handling-Location-Events-in-the-Background
위도/경도 쌍과 해당 위치의 더 사용자 친화적 설명 사이를 변환합니다.
https://developer.apple.com/documentation/corelocation/converting_between_coordinates_and_user-friendly_place_names
https://velog.io/@panther222128/Converting-Between-Coordinates-and-User-Friendly-Place-Names
지도에 표시된 사용자의 위치를 리버스 지오코딩을 통해 정보를 갖는 텍스트 설명으로 변환합니다.
https://developer.apple.com/documentation/mapkit/mkmapview/converting_a_user_s_location_to_a_descriptive_placemark
https://velog.io/@panther222128/Converting-a-Users-Location-to-a-Descriptive-Placemark