[iOS] 위치정보 사용 동의에 관한 정리

iOS에서 위치정보 사용 허가를 요청할 때 뜨는 화면에 대하여 정리해보았습니다.
2021.06.28

안녕하세요! 클래스메소드 CX사업본부 모바일앱팀의 정하은입니다🐑

프로젝트에 배정받은지 2달이 되어 조금씩 익숙해져가는 와중인데요. 요즘 신기능 추가를 위해 달리는 중이라 매일 바쁜 하루를 보내고 있습니다ㅠㅠ

마침 신기능이 위치정보 사용을 하기 때문에 사용자로부터 동의를 받는 것에 대한 여러 밑조사가 필요했는데, 조사하면서 새로 알게된 점이 많아 블로그에 한 번 정리해보려고 합니다.

위치정보 사용 동의를 받기 위한 화면 구성

아마 평소에 앱을 사용하시면서 한 번쯤은 위치 정보 사용을 허용하는지 물어보는 화면을 보신 적이 있으실텐데요.

위치정보 사용 동의를 받기 위해서는 CLLocationManager 인스턴스를 생성한 후, 동의 화면을 호출할 필요가 있습니다.

import CoreLocation

class MapViewController: UIViewController {
	let locationManager: CLLocationManager?

	override func viewDidLoad() {
    	locationManager = CLLocationManager()
        
        locationManager?.requestWhenInUseAuthorization()
        
        locationManager?.startUpdatingLocation()
   }
}

마지막으로 info.plist에 NSLocationAlwaysAndWhenInUseUsageDescription Key를 추가해주면 위치 정보 사용 동의를 요청하는 화면이 뜨게 됩니다.

'항상 허용' 선택지가 없다?

WWDC2019의 세션 영상 중 하나인 What's new in Core Location을 보시면 위치정보 사용 동의에 대한 화면이 과거와 달라졌다는 것을 확인할 수 있습니다.

iOS13부터 항상 허용이라는 선택지가 없어지고 앱을 사용하는 동안 허용으로 바뀌게 되었습니다.

항상 허용앱을 사용하는 동안 의 차이는 백그라운드 상태에서 위치정보 제공을 허용하는지에 대한 여부인데요.

- 항상 허용 (Always) : 백그라운드 상태에서도 위치정보 접근 허용

- 앱을 사용하는 동안 (WhenInUse) : 포그라운드 상태에서만 위치정보 접근 허용

사실 사용자 입장에서는 앱을 사용하지 않는 동안에도 위치정보를 제공한다는 것이 꽤나 민감한 문제이기도 하죠. 앱을 실행하지 않아도 정기적으로 위치정보를 취득해야하는 앱이 아니라면 항상 허용해 둘 필요가 없구요.

하지만 백그라운드에서도 위치정보 사용이 필요한 앱의 경우는 항상 허용 선택지가 필요하게 됩니다. (아이러니하게도 항상 허용의 선택지를 사용해야하는 앱은 적지 않다는 것....)

우선 아래와 같이 코드를 작성합니다.

class MapViewController: UIViewController {
	let locationManager: CLLocationManager?

	override func viewDidLoad() {
    	locationManager = CLLocationManager()
        
        locationManager.allowsBackgroundLocationUpdates = true
        
        locationManager.requestAlwaysAuthorization()
        
        locationManager.startUpdatingLocation()
   }
}

그리고 프로젝트 파일에서 Signing&Capabilities에 Background Modes를 추가해 Location updates 를 선택해주세요.

실행을 하면 아래와 같은 화면이 뜹니다. 그런데 전혀 바뀐 게 없다구요?

일단 여기서 앱을 사용하는 동안 을 선택해줍니다.

앱을 백그라운드 상태로 전환하고, 기기를 움직이거나 시뮬레이터의 위치 정보를 바꿔주세요. 그러면 사용하는 동안만 유지 , 항상 허용으로 변경 두 개의 선택지가 가 있는 화면이 뜹니다.

여기서 항상 허용 선택지를 선택하게 되면 백그라운드 상태에서도 위치정보를 접근하도록 설정이 된답니다.

정확한 위치정보 사용

아마 요즘은 iOS14를 쓰시는 분들이 대부분 이실거라 위의 사진들에서 조금 위화감을 느끼신 분들이 계시지 않을까 합니다.

iOS14에서는 아래와 같이 위치 정보 사용 동의 화면 내에 작은 지도 화면과 정확한 위치정보를 사용할 지 여부를 선택하는 버튼이 추가되었습니다.

WWDC2020 세션 영상 중 하나인 What's new in Location 에서 정확한 위치정보에 대한 설명을 이렇게 이야기합니다.

정확한 위치 정보를 사용하지 않는 것은

사용자의 실제 위치 주위에 노이즈를 추가하는 등의 방법으로 산출하는 것이 아닌, 지면을 몇 개의 구역으로 나눠 1시간에 약 4회 정도 사용자가 어느 구역에 있는지를 계측하는 것입니다.

이 구역의 크기는 수킬로미터 범위가 되지만, 밀도가 낮은 교외지역은 10킬로미터 이상도 될 수 있습니다.

위치정보는 사용자 위치에서 가장 가까운 지역의 중심을 표시하기 때문에, 여러 개의 도시가 가까이 있는 경우 그 옆의 도시로 판정될 수도 있습니다.

그리하여 정확한 위치 정보 사용 설정을 OFF로 하는 경우 아래와 같이 지도 범위가 바뀌게 되면서 원도 크게 변합니다.

실제로 확인해보니 제가 위치한 실제 위치보다도 1-2km 정도 떨어진 위치가 원의 중심이 되며, 원의 둘레를 대략 보았을 때 구역의 크기는 반경 3-5km 정도였습니다.

즉, 정확한 위치 정보 설정을 사용하지 않을 경우에는 사용자가 어느 구 또는 시에 있는지 정도의 판별 밖에 하지 못하게 됩니다. 실시간으로 위치정보를 받아 갱신해야하는 앱 (네비게이션 등) 에서는 치명적일 수 밖에 없겠죠.

그렇기 때문에 앱 기능상 정확한 위치 정보를 ON으로 반드시 설정 해야하는 경우, 요청 화면을 띄우는 코드를 미리 작성하여 위와 같은 문제를 개선할 수 있습니다.

if manager.accuracyAuthorization = .reducedAccuracy {

   // 일시적으로 사용자에게 허가를 요청
    // puroposeKey는 info.plist의 NSLocationTemporaryUsageDescriptionDictionary안에 입력해 둔 키명을 써주시면 됩니다.
      manager.requestTemporaryFullAccuracyAuthorization(withPurposeKey: "Navigate") {
          if self.manager.accuracyAuthorization = .fullAccuracy {
             self.begin()
          } 
      }
   } else {
      self.begin()
   }
}

마무리하며

평소에도 위치정보를 사용해왔지만 이렇게 위치정보 허가를 요청하는 화면을 자세히 알아보는 건 처음이었는데요. 그만큼 제가 신경 쓰지 않았던 부분에서 여러 변화가 있었고 애플리케이션 개발은 코드 작성에 대한 고민 뿐만 아니라 사용자 입장에 대한 고려를 빼놓을 수 없다는 것을 느꼈습니다.

특히 위치정보와 관련된 기능은 사용자의 개인정보와도 비슷하게 민감한 정보를 다루기 때문에 이런 밑조사가 중요하다고 생각했구요.

앱 개발에 관여하시는 여러분들께 작은 깨달음이 되기를 바라며 다음에도 유익한 정보로 돌아오겠습니다! 🙂