web-dev-qa-db-ja.com

Swift LocationManager didChangeAuthorizationStatus Called Called

CLLocationManagerDelegateを実装するビューコントローラーがあります。 CLLocationManager変数を作成します。

let locationManager = CLLocationManager()

次に、viewDidLoadでプロパティを設定します。

// Set location manager properties
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
locationManager.distanceFilter = 50

問題は、認証ステータスを確認する前でも関数が呼び出されることです。

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if (status == .AuthorizedWhenInUse) {
        // User has granted autorization to location, get location
        locationManager.startUpdatingLocation()
    }
}

誰かがこれを引き起こす原因を教えてくれますか?

26
Mike Walker

- locationManager:didChangeAuthorizationStatus:は、CLLocationManagerが初期化された直後に呼び出されます。

必要に応じて、デリゲートメソッド内で承認をリクエストできます。

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    switch status {
    case .NotDetermined:
        locationManager.requestAlwaysAuthorization()
        break
    case .AuthorizedWhenInUse:
        locationManager.startUpdatingLocation()
        break
    case .AuthorizedAlways:
        locationManager.startUpdatingLocation()
        break
    case .Restricted:
        // restricted by e.g. parental controls. User can't enable Location Services
        break
    case .Denied:
        // user denied your app access to Location Services, but can grant access from Settings.app
        break
    default:
        break
    }
}

これを機能させたい場合は、「適時に」問題でデリゲートを割り当てる必要があることに注意してください。

デリゲートの割り当てをなんとかして延期する場合。非同期に設定すると、- locationManager:didChangeAuthorizationStatus:への最初の呼び出しを見逃す可能性があります。

48

Swift

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        switch status {
        case .notDetermined:
            manager.requestAlwaysAuthorization()
            break
        case .authorizedWhenInUse:
            manager.startUpdatingLocation()
            break
        case .authorizedAlways:
            manager.startUpdatingLocation()
            break
        case .restricted:
            // restricted by e.g. parental controls. User can't enable Location Services
            break
        case .denied:
            // user denied your app access to Location Services, but can grant access from Settings.app
            break
        }
    }
6
Vyacheslav

他の答えは、新しい望ましくない動作を引き起こす可能性があります。

最初の呼び出しを防ぐためにブール値とガードを追加するだけで、いくつかのコメントでバグを説明できます。

var firstTimeCalled = true

// ...    

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

    guard !firstTimeCalled else {
        firstTimeCalled = false
        return
    }

    // ... send status to listeners
}
0
Xys