본문 바로가기

iOS

현위치 위도,경도로 지역명 갖고 오기

728x90

사용자의 현재 위치(위도/경도)를 바탕으로 지역명을 갖고 오는 기능을 구현해보자.

어떻게? CLGeocoder를 통해서!

 

CLGeocoder

사용자가 현재 앱을 실행할 때의 위도, 경도값을 가지고 네트워크 연결을 하여, placemark를 뽑아주는 기능이다.
즉 coordinate 정보에 맞게 place name으로 변환시켜주는 코더라고 보면 된다.

 

애플문서를 확인해보면, Geocoding을 사용하기 위한 규칙이 있다.

✅ 하나의 사용자 작업에서 최대 하나의 지오코딩 요청을 보낸다. 
✅ 사용자가 동일한 위치의 지오코딩과 관련된 여러 작업을 수행하는 경우 각 작업에 대한 개별 요청을 시작하는 대신 초기 지오코딩 요청의 결과를 재사용한다.
✅ 일반적인 상황에서 분당 지오코딩 요청을 두번이상 보내면 안된다고 한다.
✅ 사용자가 결과를 즉시 볼 수 없는 시간에 지오코딩 요청을 시작하지 마세요.
✅ 앱이 비활성 상태이거나 백그라운드에 있는 경우 요청 시작 xx근데 이거하려면 네트워크에 액세스할 수 있어야한다.
✅ 특정 위치에 정보를 사용할 수 없는 경우 에러 보고한다. 
✅ Mapkit 과 함께 쓸 수도 있고 독립적으로도 사용 가능하다. 

주의해야 할 점은 해당 기능이 결국 네트워크 요청이 필요한 작업이다. 그렇기 때문에 너무 빈번하게 가져오는 것이 좋은 코드가 아니다.

이 네트워크 요청이 각 앱에 대해서 비율이 제한되어 있고, 짧은 시간내에 너무 많은 요청을 하게 되면 일부 요청이 실패될 수도 있다.

(최대 비율을 초과하게 되면 Geocoder는 오류 객체로 완료 핸들러에 반환한다고 한다.) 

 

CLPlackmark

네트워크 연결 성공하고나서 받는 객체는 반환 값으로 CLPlacemark 타입 객체를 받는다

장소의 이름, 주소 기타 관련 정보 포함하는 사용자에게 친화적인 설명을 제공한다.

 

name
장소의 이름. (예) 한깉로 12-3

 

isoCountryCode
축약된 국가 , 또는 지역 이름 (예) KR

 

country
국가 또는 지역의 이름 (예) 대한민국

 

postalCode
우편번호 (예) 16212

 

administrativeArea
시/도 정보 (예) 서울특별시

 

subAdminstrativeArea
추가 관리 지역 정보 (예) nil이 나오던데 모르겠네요;

 

locality
장소 표시와 연결된 도시 (예) 서울특별시

 

subLocality
추가 도시 수준 정보 (예) 서울특별시 

 

thoroughfare
상세 주소 (예) 이것 역시 nil이 나오던데 모르겠네요;

 

subThoroughfare
추가 거리 정보 (예) 16-2

 

region
지리적 지역 (예) CLRegion으로 나옴 뭐 radius, center.. 위도경도값 나오는 같다. 

 

timeZone
연결된 시간대 (예) TimeZone 타입으로 나옴. Asia/Seoul이나GMT+9.. 등등으로 나온다. 

 

inlandWater
장소 표시와 연결된 내륙 수역의 이름

 

ocean
장소 표시와 연결된 바다의 이름

 

 

코드 

코드로 살펴보면 아래와 같다. 

private func convertLocationToSublocality(_ location: CLLocation){
    let geocoder = CLGeocoder()
    let locale = Locale(identifier: "Ko-kr")
    
    // geocoder로 네트워크 요청한다. 
    geocoder.reverseGeocodeLocation(location, preferredLocale: locale, completionHandler: {(placemarks, error) in
    	// 반환 값으로 CLPlacemark 배열을 받는다. 
        if let address: [CLPlacemark] = placemarks {
         	// 배열 중 가장 마지막에 해당하는 값에 접근한 뒤, 그 안의 프로퍼티를 통해 원하는 형태의 지역명을 갖고 온다.
            if let result: String = address.last?.subLocality {
                self.currentSublocality = result
            }
        }
    })
}

 

🤔 정말 정말 모르겠는 것이 하나 있습니다. 

왜 지역명을 갖고 올 때, ~시/~동은 갖고 오는데 그 사이의 ~동은 안갖고 오는 것인지. 도대체 왜???????

그래서 구(행정구) 정보를 알고 싶으면 .. 동 정보를 바탕으로 분기처리를 해야한다 .. ㅋㅂㄴ .. 해결방법을 알고 있다면 .. 당장 알려주세요. 당장. 

 

 

 

'iOS' 카테고리의 다른 글

[iOS 16+] 개발자모드 (Developer Mode)  (0) 2022.10.11
[iOS] Crash Report 확인하기  (0) 2022.10.07
[App Store Connect] 앱 정보 작성  (0) 2022.09.16
Custom Navigation Back Gesture  (0) 2022.09.10
[Concurrency] GCD  (0) 2022.09.06