저희가 개발한 프로젝트에는 위도와 경도를 가지고 주소를 나타내주는 기능이 있습니다.
예를 들면 [37.51284694196123, 126.95315590794291 ]
의 경우 서울특별시 동작구
가 나오게 됩니다.
개발 중 하나의 시뮬레이터만 계속 사용하다가, 아이폰 SE에서의 레이아웃을 확인하기 위해 새로 시뮬레이터를 켜고 확인을 하려고 하였습니다.
그런데 계속 저 주소 정보가 빈칸으로 나오는 문제가 발생하였습니다.
그래서 팀원들을 긴급 소집(?)했고, 문제에 대한 원인을 찾기 시작하였습니다.
글이 너무 길어서 결론을 앞에 말씀드리겠습니다.
저희가 내린 결론은 다음과 같습니다.
저희가 발견한 차이점은 애플 지도
에 있었습니다.
애플 지도 또한 똑같이 어떤 기기에서는 도로명 주소를, 다른 기기에서는 지번 주소를 나타냈는데요, 도로명 주소 뿐만 아니라 지도 자체에도 조금씩 차이가 있다는 것을 확인했습니다.
또한 애플 지도의 제공처에도 차이가 있음을 확인하였습니다.
- 기기마다 지도의 제공처가 다르고, 실기기는 주소를 잘 나타내 주는 제공처가 나올 확률이 높다.
- 하지만 어떠한 상황에서도 정보를 올바르게 표시해 주어야 한다.
- 따라서
CLPlacemark
에서 내려주는 정보를 분석하여 알맞게 텍스트로 변환해 주자!
저희가 발견하고 정리한 문제는 다음과 같았습니다.
아이폰 14, 13 등의 시뮬레이터에서는 제대로 나오지만, 아이폰 SE 시리즈의 시뮬레이터에서만 텍스트가 제대로 나오지 않는다.
따라서 제일 처음 생각했던 것은 "기기의 크기가 작아서 UILabel
레이아웃이 잘 잡히지 않았던 걸까?" 였습니다.
위는 저희가 텍스트에 대한 정보를 구성해주는 코드였습니다. 아이폰 SE에서 저 부분의 String을 출력해 본 결과, 빈 문자열이 아닌 " "
, 즉 저 코드의 가운데에 있는 공백문자만 들어가 있었습니다.
따라서 기기의 크기에 대한 문제가 아니라는 것을 파악하였습니다.
두 번째로는 SE 시리즈만 문제가 발생했기 때문에, 뭔가 기기의 CoreLocation이 차이가 있지 않을까 였습니다. 하지만 실제 아이폰 SE 기기를 가지고 있는 캠퍼가 확인해본 결과, 실제 SE 기기에서는 제대로 나오는 것을 확인하였습니다.
따라서 아이폰 SE 시리즈에서만 특별하게 발생하는 문제가 아니라는 것을 파악하였습니다.
저희는 맨 처음 좌표를 주소로 변경해주는 CLGeocoder
의 공식 문서 설명을 찾아보았습니다. 그러나 그 어디에도 기기마다 CoreLocation이 다르다는 말이 없었습니다.
그래서 CLGeocodeCompletionHandler
에 전달되는 파라미터를 자세히 살펴보았습니다.
CLGeocodeCompletionHandler
CLGeocodeCompletionHandler
는CLGecoder
의 geocode 관련 요청에 대한 핸들러를 나타냅니다.
우선 뭔가 잘못되었으니, Error
에 전달되는 값을 살펴보았습니다.
제대로 나오지 않을 경우에도 에러는 nil
이거나, 혹은 Geocoder의 특징인 "1분 안에 50번의 요청을 보내서 조금만 쉬었다가 보내라"라는 에러만 발생했습니다.
그래서 CLPlacemark
를 살펴보았습니다.
저희는 아까 전의 코드에 적혀 있듯이 배열의 첫 번째 값만 사용하였습니다.
first
와 locality
, subLocality
모두 옵셔널 타입인데, 우선 first
는 nil
이 아닌 것을 확인했습니다.
그렇다면 locality
가 문제일 것이라고 판단하여, address.first?.addressDictionary
를 살펴보았습니다.
addressDictionary
(deprecated)
CLPlacemark
에 담겨 있는 모든 주소 정보를 담고 있는 딕셔너리입니다.
정말 어이가 없게도 공백이 담기는 곳에는 "도로명 주소"
가 나오고,
제대로 값이 나오는 곳에는 "지번 주소"
가 나오는 것이었습니다.
그런데 저희 팀원의 시뮬레이터와 제 시뮬레이터 모두 아이폰 14, iOS 16.0
환경이었습니다.
똑같은 기기에 똑같은 OS, 똑같은 시스템 언어와 지역 설정인데 어떻게 저런 차이가 발생했던 것일까요?
🔸 아래 내용부터는 확실하지는 않지만 여러 기기를 확인해본 결과 가장 대표적인 차이점으로 나왔던 점을 정리하였습니다.
저희가 발견한 차이점은 애플 지도
에 있었습니다.
애플 지도 또한 똑같이 어떤 기기에서는 도로명 주소를, 다른 기기에서는 지번 주소를 나타냈는데요, 도로명 주소 뿐만 아니라 지도 자체에도 조금씩 차이가 있다는 것을 확인했습니다.
또한 애플 지도의 제공처에도 차이가 있음을 확인하였습니다.
저희가 내린 결론은 다음과 같습니다.
- 기기마다 지도의 제공처가 다르고, 실기기는 주소를 잘 나타내 주는 제공처가 나올 확률이 높다.
- 하지만 어떠한 상황에서도 정보를 올바르게 표시해 주어야 한다.
- 따라서
CLPlacemark
에서 내려주는 정보를 분석하여 알맞게 텍스트로 변환해 주자!
그래서 현재 코드는 CLPlacemark
의 locality
와 thoroughfare
등의 정보를 알맞게 분석하여 최대한 제대로 된 주소를 텍스트로 변환해주게 되었습니다!