Это допустимое использование обратного вызова авторизации местоположения? - PullRequest
1 голос
/ 16 апреля 2019

Я реализовал функцию обратного вызова авторизации местоположения, и она работает, но, просматривая код, я, кажется, получил функцию для запуска, но фактически никогда не использовал эту функцию, как предполагалось. Пожалуйста, вы можете прокомментировать, насколько я плох, и допустимо ли делать то, что я сделал.

import UIKit
import CoreLocation


class ViewController___Main_menu: UIViewController, CLLocationManagerDelegate {

    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestWhenInUseAuthorization()

        if CLLocationManager.locationServicesEnabled() {
            print("services are enabled")
            switch CLLocationManager.authorizationStatus() {
            case .notDetermined:
                print("Not determined")
            case .restricted:
                print("Resticted")
            case .denied:
                print("Denied")
            case .authorizedAlways, .authorizedWhenInUse:
                print("Access")
            @unknown default:
                print("unknown error")
            }
        } else {
        print("not enabled")
        }

    }


    public func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus){
        print("Status: \(status)")
        switch CLLocationManager.authorizationStatus() {
        case .notDetermined:
            print("Not determined")
        case .restricted:
            print("Resticted")
        case .denied:
            print("Denied")
        case .authorizedAlways, .authorizedWhenInUse:
            print("Access")
        @unknown default:
            print("unknown error")
        }

    }
}

1 Ответ

0 голосов
/ 16 апреля 2019

Похоже, вы запрашиваете доступ к службам определения местоположения и сразу после этого проверяете статус авторизации, ожидая, что он будет доступен немедленно. Это не так, как это работает. Когда вы запрашиваете местоположение с помощью locationManager.requestWhenInUseAuthorization, запрос происходит асинхронно.

Когда статус местоположения изменится, он вызовет функцию, которую вы включили locationManager(_:didChangeAuthorization) с новым статусом. Это произойдет, когда пользователь нажмет «Разрешить» или «Запретить» в появившейся подсказке. Это также может произойти, когда они заходят в настройки и меняют там разрешения

Чтобы сделать это более понятным, проверьте и зарегистрируйте статус авторизации, прежде чем запрашивать местоположение. Используйте следующие методы, чтобы узнать, был ли запрос местоположения успешным или неудачным:

func locationManager(CLLocationManager, didUpdateLocations: [CLLocation])
func locationManager(CLLocationManager, didFailWithError: Error)

Вы можете использовать чек CLLocationManager.locationServicesEnabled(), чтобы обернуть запрос на услуги определения местоположения. Если местоположение отключено для устройства, то запрос местоположения вызовет только ошибку.

...