티스토리 뷰

위치 정보를 받아오려면 권한 허용이 필요한데, 권한을 요청받기 위해서는 우선 info.plist에 사용할 권한을 추가해야한다.

 

 

앱이 foreground상태인 경우에만 위치 정보를 받을 것이므로 일단 아래의 것만 추가해주었다.

(꼭 필요한 권한만 설정해야하며, String에도 구체적으로 description이 적혀있어야 리젝되지 않는다.)

 

 

Location Always Usage Description, Location Default Accuracy Reduced 등 Location과 관련된 권한들이 더 있으니 필요에 따라 필수적인 것들만 추가해주면 될 것 같다.

 

 

이제 위치를 받아오기 위한 과정을 차례대로 진행해보자.

 

 

Location에 관한 것들은 거의 대부분 CoreLocation프레임워크에서 이루어진다고 생각하면 된다.

 

 

CoreLocation을 import하고 CLLocationManager인스턴스를 만들어주자.

 

 

LocationManager의 메서드를 활용하기 위해 CLLocationManagerDelegate프로토콜을 채택하고 위임자도 지정해준다.

 

 

CLLocationManagerDelegate의 메서드들 중 몇 가지를 이용해보자.

 

 

우선, 사용자의 위치를 성공적으로 가져온 경우에 사용하는 didUpdateLocations메서드와 성공적으로 가져오지 못한 경우에 사용하는 didFailWithError가 있다.

 

 

didUpdateLocations 메서드에서 매개변수로 받는 location에는 위도, 경도와 함께 다양한 정보가 들어있음.

 

 

location의 마지막 원소에는 coordinate정보가 들어있는데, 이를 가져오면 위치를 알 수 있음.

 

이때 메서드 내에 locationManager.stopUpdatingLocation() 도 같이 작성해야 계속해서 위치를 얻어오는 것을 막을 수 있다.

 

 

여기까지만 진행하면 사용자의 위치를 받아올 수 없다.

 

 

didUpdateLocations메서드가 실행되기 위해서는 사용자의 위치를 성공적으로 가져와야하고, 가져오기 위해서는 권한이 허용된 상태여야 한다.

 

 

앞의 두 개를 해결했으니 이제 사용자의 현재 권한 상태를 확인하여 좌표를 얻어오는 일만 남았다.

 

 

CLLocationManager에는 authorizationStatus라는 프로퍼티가 있다.

 

 

유추할 수 있겠지만 단어 그대로 권한 상태를 나타내는 프로퍼티이다.

 

 

이때, iOS14를 기준으로 나눠지므로 동시에 이용할 예정이라면 아래와 같이 버전에 따라 따로 작성해줘야한다.

 

authorizationStatus의 값은 다섯가지 상태로 나뉠 것이다.

 

 

notDetermined: 아직 앱이 위치서비스를 사용할지 선택하지 않은 상태인 

 

restricted: 위치 서비스를 사용할 수 있는 권한이 없는 경우

 

denied: 위치 서비스 사용을 거부한 경우

 

authorizedAlways: 언제든지 사용을 허용한 경우

 

authorizedAlways: 앱이 사용중일 때만 사용을 허용한 경우

 

 

각 상태별로 어떤 코드를 실행할지 함수를 따로 선언하여 CLLocationManager.locationServicesEnabled()이 true일때 해당 함수를 호출하면 될 것이다.

 

생각해보면 각 상태일때 어떤 작업을 해야할지 감이 올 것이다.

 

 

우선, notDetermined상태에서는 위치 권한을 요청하는 것이 중요하다. 또한, desiredAccuracy같이 부가적인 코드를 작성해도 괜찮을 것이다.

 

 

desiredAccuracy는 위치 정확도를 의미한다.

 

 

지금 전체 경우를 전부 다 작성하지 않았지만 나머지도 마찬가지로 작성해주면된다.

 

 

나라면 거부되었을때는 아이폰 설정에서 위치 권한을 허용하도록 아래와 같은 함수를 호출할 것이다.

 

 

그리고 이제 허용 상태에서는 startUpdatingLocation메서드를 호출하여 이전에 작성했던 didUpdateLocation을 실행할 것이다.

 

 

마지막으로, 사용자의 위치 권한 상태가 바뀌는 경우를 생각해야한다.

 

 

예를 들어, 처음에는 허용했지만 다시 설정에 가서 거부할 수도 있는 것이다.

 

 

이를 대응하기 위해 CLLocationManagerDelegate의 locationManagerDidChangeAuthorization에 다시 사용자의 권한 상태를 체크하는 메서드를 실행시켜주면 될 것이다.

 

 

이 메서드는 CLLocationManager인스턴스가 생성될 때도 실행된다.

 

 

이제 아래처럼 좌표를 구해올 수 있을 것이다.

 

 

위의 좌표와 MapKit을 이용한다면 지도에도 위치를 표시할 수 있을 것이다.

댓글
최근에 올라온 글
Total
Today
Yesterday