잠정적 항상 권한 부여를 잠정적으로 만드는 것은 무엇입니까?

Aug 16 2020

Apple에 따르면 인증이 "결정되지 않은"상태에서 항상 인증을 받도록 Core Location 앱을 요청하면 사용자에게 When In Use 인증 대화 상자가 표시되지만 실제로 앱은 임시로 항상 인증을받습니다.

이것은 실제로 Always 기능을 사용 하지 않으면 사용 중일 때로 되돌아 가서 손실 된다는 것을 의미합니다 .

좋아요,하지만 언제 그 복귀가 일어날까요? 나는 그렇게 할 수없는 것 같다. 사용자 가 When In Use 인증이라고 생각 하더라도 내 앱은 항상 인증 상태로 유지됩니다 .

다음은 내 테스트 앱 (iOS 14)의 전체 코드입니다.

class ViewController: UIViewController, CLLocationManagerDelegate {
    @IBOutlet weak var label: UILabel!
    
    let locman = CLLocationManager()
    override func viewDidLoad() {
        super.viewDidLoad()
        locman.delegate = self
    }

    @IBAction func doAskForAlways(_ sender: Any) {
        self.checkForLocationAccess(always:true)
    }
    
    func checkForLocationAccess(always:Bool = false, andThen f: (()->())? = nil) {
        let status = self.locman.authorizationStatus()
        switch status {
        case .authorizedWhenInUse:
            if always { // try to step up
                self.locman.requestAlwaysAuthorization()
            } else {
                f?()
            }
        case .authorizedAlways:
            f?()
        case .notDetermined:
            if always {
                self.locman.requestAlwaysAuthorization()
            } else {
                self.locman.requestWhenInUseAuthorization()
            }
        case .restricted:
            break
        case .denied:
            break
        default: fatalError()
        }
    }
    
    fileprivate func updateStatus(_ status: CLAuthorizationStatus) {
        self.label.text = {
            switch status {
            case .authorizedAlways: return "Always"
            case .authorizedWhenInUse: return "When In Use"
            default: return ""
            }
        }()
    }
    
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        let status = manager.authorizationStatus()
        print("authorization is", status.rawValue)
        updateStatus(status)
    }
    
    @IBAction func doStatus(_ sender: Any) {
        self.updateStatus(self.locman.authorizationStatus())
    }
}

두 개의 버튼과 레이블이 필요합니다. 시작 권한이없는 경우 ( "미정") 항상 인증을 요청하려면 첫 번째 버튼을 누릅니다. When In Use 인증 대화 상자가 표시됩니다. 권한 부여. 이제 앱을 사용하여 레이블의 상태 표시를 계속 확인하십시오. 필요한 경우 두 번째 버튼을 눌러 상태를 업데이트 할 수 있습니다.

문제는 항상 유지된다는 것입니다. 언제 내 "프로 비전"이 ​​종료되어 권한이 사용 중으로 되돌아가나요? 이것이 일어나도록 어떻게 장려 할 수 있습니까?

답변

5 Rob Aug 16 2020 at 04:12

WWDC 2019의 Core Location의 새로운 기능 에서는 iOS 13.0의 기본 프로세스를 설명합니다.

  1. 앱에서 "항상"권한을 요청합니다.

  2. 사용자에게 "항상"권한 경고가 아닌 "사용 중"권한 경고가 표시됩니다.

  3. 사용자가 "사용 중"을 허용하면 앱은 "항상 임시"상태입니다.

    이 경우 다소 혼란스럽게도이 "임시적 항상"상태에있을 때이 authorizationStatus반환 .authorizedAlways되고 전화기의 설정 앱에서 "사용 중"상태에 있다고 제안합니다. 그러나 실제로는이 "임시적 항상"상태 authorizationStatus에 있으며 설정 앱에서 볼 수있는 것과 추론 할 수있는 것과는 다릅니다 .

    말할 필요도없이, 사용자가 "사용 중"을 허용하지 않는 경우 (예 : 거부하거나 "한 번만"선택) 분명히 "항상 임시"상태가되지는 않습니다.

  4. 비디오에서 "항상"권한을 사용하기 시작할 때까지이 임시 상태로 유지됩니다. 예를 들어 중요한 변경 서비스를 시작하고 중요한 변경을 트리거하기에 충분한 거리를 이동하는 경우입니다.

    앱이 " '항상'권한을 사용하여 시작"하면 OS는 사용자에게 "사용 중"을 "항상"으로 업그레이드 할 것인지 묻습니다. (항상 즉시 발생하는 것은 아니지만 사용자가 다른 일을 하느라 바쁘지 않을 때까지 기다릴 것입니다. 사용자가하던 작업으로 돌아 가기 위해 경고를 해제 할 위험을 줄입니다.)

따라서 다른 상태로 "되 돌리는"문제가 아닙니다. 앱은 최종 "동의"가있을 때까지이 "임시"상태로 유지됩니다 (사용자가 두 번째 경고를보고 업그레이드에 동의 .authorizedAlways하거나 거부하고로 설정 됨 .authorizedWhenInUse).


나는 당신이 이것을 알고 있다는 것을 알고 있지만 미래의 독자들을 위해 :

WWDC 2020 비디오 What 's new in location 에서는 iOS 13.4에 도입 된 변경 사항을 설명합니다. 위의 흐름 대신 ( "항상"을 요청하면 사용자에게 "사용 중"권한이 표시되고 "항상"서비스가 실제로 트리거 될 때까지 "항상으로 업그레이드"가 표시되지 않음) iOS 13.4는 "사용 중"( "항상"이 아닌)을 요청할 수 있고 사용자가 권한을 부여했다고 가정 할 수있는 새로운 흐름은 앱에서 적절한 경우 나중에 "항상"을 요청할 수 있으며 사용자는 두 번째 경고 ( 이번에는 사용자가 "항상"으로 업그레이드할지 여부를 묻습니다). 적절한 권한 문자열 만 있으면됩니다.