WWDC21) Location Button

12340 단어 WWDC21iOSWWDC21

개인정보를 보호하는 것은 애플 제품에서 핵심 기능 중 하나이다. 그리고 사용자들이 그들의 개인정보에 대해서 걱정하는 것은 놀라운 일이 아니다.

개발자로서, 적절하지 않은 타이밍이나 충분히 명백하지 않은 문맥에서 사용자의 민감한 데이터를 요구하는 것은 좋지 못한 일이다.

iOS 15에서, 애플은 사용자의 위치를 요구하는 새로운 방식인 Location Button을 소개했다.

기존의 서비스에서 어떤 문제가 있었기에 애플은 해당 UI를 새로 도입했을까?

The Problems

location button은 보다 나은 방식으로 one-time 사용자 위치를 제공하고 있다. 사용자 위치를 묻는 것이 앱의 핵심 기능은 아니지만 현재 사용자 위치를 가져와서 근처 상점을 보여주고 메시지 앱을 통해 친구에게 현재 위치를 보내느 등의 추가 기능을 제공하는 앱에 적합하다.

그러나 기존의 방식에서 일회성 위치를 요청하는 것은 다음 영역의 현재 구현에서 문제가 됩니다.

One-Shot

일반적으로 어떠한 형식이든 간에 위치 정보의 허가를 요청하는 것은 사용자가 그것을 수락/거절할 수 있는 기회가 한번 뿐이라는 것에 있다.

사용자가 '허용 안 함'을 누르면 이후 사용자 위치에 대한 요청은 소용이 없다. 이를 다시 허용할 수 있는 방법은 설정에 들어가서 따로 지정하는 것이다.


이 때, 사용자는 위와 같은 위치 허용에 대한 팝업 메시지를 한 번만 볼 수 있고 앱이 제거된 후에도 쉽게 바뀌지 않는다.

Allow Once

위치 허용에 대한 옵션 중 Allow Once의 경우, 임시적이고 최소한의 제약 조건을 주는 것처럼 보이지만 실제로는 최악의 옵션이다. 이 옵션을 선택하게 되면 다음에 사용자의 위치를 요청할 때 권한 부여 요청 대화 상자가 다시 표시됨을 의미한다.

화면을 표시한 후에 사용자의 위치를 가져오는 경우 단일 위치가 필요할 때마다 이미징 작업이 필요하고 사용자들은 결국 불편함을 겪게 된다.

iOS 13에서 애플은 "한 번 허용" 옵션을 제공했다. 허용이라는 단어가 포함되어 있지만, 실질적으로는 나중에 결정하는 옵션과 다를 것이 없고 일회성 사용자 위치를 요청할 방법이 없다.

Location Button

이러한 문제점을 해결 할 수 있는 일회성 사용자 위치를 묻는 새로운 방식이 필요하다.

Key Difference

location button의 경우 서비스를 이용하는 장기 사용자들의 위치를 부여하는 방법으로 설계되어 있다. 그렇기 때문에 일회성 사용자의 위치를 묻는 것이 더 캐주얼하고 생각보다 많은 제한을 두고 디자인 되었다.

New Dialog


사용자들은 location button을 탭하고 나서 위와 같은 새로운 화면을 볼 수 있다. 사용자 위치 허용에 대한 옵션이 두가지로 제공 된다.

No need to put privacy description

When you share your location with this app, a blue location indicator will appear in the status bar.

애플에서는 다음과 같이 말하며 Info.plist에서 NSLocationWhenInUseUsageDescription와 같은 설정을 할 필요가 없다.

You can ask it again and again

옵션에서 볼 수 있는 것처럼 더이상 사용자에게 계속해서 위치 정보 허용에 대한물음을 하지 않아도 된다. 나중에 해당 서비스를 사용하게 되어도 똑같은 팝업창이 뜨기 때문에 그 때 다시 설정하면 되는 것이다.

Conclusion

다음과 같이 정리 할 수 있다.
Location Button 은 필요한 때와 장소에서만 앱 위치 액세스 권한을 부여할 수 있는 인터페이스이다.

기존 방법에서는 위치 정보를 얻기 위해서는 전체 위치 권한을 받아야 했지만, Location Button을 사용하면 위치 권한이 필요한 경우에 가볍게 위치 권한을 요청해 사용할 수 있게 된다.

SwiftUI 에서는 LocationButton, UIKit 에서는 CoreLocationButton 으로 제공되며, CoreLocationUI framework 에 포함되어 있다.

Example Code


기존의 방법에서는 위의 코드에서 볼 수 있는 것처럼 requestWhenInUseAuthorization()을 작성하여 위치 정보를 불렀어야 했다.

그러나, 이 코드를 CLLocationButton 을 사용하도록 변경하면 다음과 같이 바꿀 수 있다.

별도의 권한 요청 없이 위치 정보를 받을 수 있고 frame 을 지정할 수 있고, icon, label 등의 속성을 활용해 다양한 형태로 UI를 구성할 수 있다.

위치 정보가 중요한 서비스라면, 위치 권한을 거부 당했을 때 리스크가 굉장히 클 수 있다. LocationButton 을 사용하면 개발자 입장에서는 위치 권한을 거부당하는 일이 줄어들어 좋을 것 같고, 사용자 입장에서는 위치 정보를 필요한 순간 마다 요청받을 수 있어 좋을 것 같다.

Tutorial

MapKit와 함께 사용해서 location button을 눌렀을 때 위치 정보 허용을 한다면 나의 위치로 지도를 보여주는 예제를 만들어보자

  1. 지도를 생성한다.
  2. location button을 생성한다.
  3. 버튼을 눌렀을 때 사용자의 위치 정보를 받아 지도에서 표시될 수 있도록 연결한다.

이런 세가지 단계를 거쳐서 예제를 완성할 수 있다.

MapKit

먼저 import MapKit 를 하고

view.addSubview(mapView)
mapView.frame = CGRect(x: 20, y: 50, width: view.frame.width.self-40, height: view.frame.height.self-220) 

viewDidLoad()에 위와 같이 작성하여 뷰에 지도를 올린다.

Location Button

Location Button의 UI와 함께 위치 정보를 받아와야 하기 때문에

import CoreLocationUI
import CoreLocation

를 작성하고

override func viewDidLoad() {
        super.viewDidLoad()
        
        ...
        
        manager.delegate = self
        
        createButton()
    }
    
private func createButton() {
        let button = CLLocationButton(frame: CGRect(x: 0, y: 0, width: 200, height: 50))
        button.label = .currentLocation
        button.icon = .arrowOutline
        button.cornerRadius = 12
        button.center = CGPoint(x: view.center.x, y: view.frame.height-70)
        button.addTarget(self, action: #selector(didTapButton), for: .touchUpInside)
        view.addSubview(button)
    }
    
@objc
func didTapButton() {
        manager.startUpdatingLocation()
    }

Location Button -> MapKit

delegate를 선언하여 위치정보 관리에 대한 부분을 담당할 수 있도록 한 뒤 location button의 configuration을 지정하여 버튼을 만들고 해당 버튼을 탭하였을 때 사용자의 위치를 받아올 수 있도록 코드를 작성한다.

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let location = locations.first else { return }
        self.manager.stopUpdatingLocation()
        
        mapView.setRegion(MKCoordinateRegion(center: location.coordinate, span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)), animated: true)
}

그리고 위치 정보 업데이트가 끝났다면 이 정보를 앞서 뷰에 올린 지도와 연결 시켜 지도에서 해당 정보를 보여줄 수 있도록 한다.

참고자료
A better way to ask for a one-time user's location with the Location Button

좋은 웹페이지 즐겨찾기