iOS/Swift

위도 경도로 현재 주소 찾기

bereben 2022. 12. 26. 18:40

프로젝트에 시,도,구의 정보가 필요하여 Swift에서 지원하는 CoreLocation기능을 사용하여 주소를 받을 예정이었다.

분명 다른 블로그에서는 시, 구, 동이 잘 들어왔는데 내 코드에서는 안 들어온다.????

문제 : 시, 구가 들어와야 하는데 구만 빼고 들어온다.

print(address.last?.postalAddress)

결과값
Optional(<CNPostalAddress: 0x280294910: street=동 123-4, subLocality=동, city=대구광역시, subAdministrativeArea=, state=대구광역시, postalCode=우편번호, country=대한민국, countryCode=KR>)

그래서 클래스 하나하나 들어가며 어떤 원리로 받아오는지 문서를 찾아봤다.
iOS에서 현재 위치의 주소를 알기 위해서는 reverseGeocodeLocation라는 역지오코딩함수에 위도, 경도의 값을 가지는 CLLocation, 식별자인 Locale 이 두 개를 인자로 넣어주면 CLPlacemark 형태로 반환하게 된다. 원래 같으면 시, 구, 동, 우편번호 모두 잘 들어와야 하지만 우리나라 주소 파싱이 제대로 안 된 모양이다.

CLPlacemark안에 addressDictionary라고 ios11까지 사용하던 딕셔너리가 있어서 혹시나 출력해봤다.

print(address.last?.addressDictionary)

결과값
Optional([AnyHashable("ZIP"): 우편번호, AnyHashable("Street"): 동 123-4, AnyHashable("SubLocality"): 동, AnyHashable("Name"): 아파트, AnyHashable("Thoroughfare"): 동, AnyHashable("Country"): 대한민국, AnyHashable("City"): 대구광역시, AnyHashable("CountryCode"): KR, AnyHashable("SubThoroughfare"): 123-4, AnyHashable("FormattedAddressLines"): <__NSArrayM 0x282ba8060>(
아파트,
대한민국 대구광역시 동구 동 123-4,
우편번호
)
, AnyHashable("State"): 대구광역시])

다행이게도 광역시와 구가 같이 있다.

그런데 NSArrayM이 뭔지 몰라서 찾아 봤다.
대충 가변 배열의 코드라는거 보니까 String 배열 같아 보인다.
https://stackoverflow.com/questions/7684611/what-is-nsarrayi-and-nsarraym-how-to-convert-to-nsarray

사용하기 위해 String 배열에 저장

var realAddress:[String] = address.last?.addressDictionary?["FormattedAddressLines"] as! [String]
print(realAddress)

결과값
["아파트", "대한민국 대구광역시 동구 동 123-4", "우편번호"]

참고
https://developer.apple.com/documentation/corelocation/clgeocoder
https://stackoverflow.com/questions/7684611/what-is-nsarrayi-and-nsarraym-how-to-convert-to-nsarray

'iOS > Swift' 카테고리의 다른 글

CocoaPods에서 SPM으로 변경  (0) 2022.12.21