CLLocationManager: didChangeAuthorizationStatus не вызывается в iOS 13 - PullRequest
0 голосов
/ 21 июня 2020

У меня есть приложение, которое отлично работает уже несколько лет, но службы определения местоположения не работают должным образом для iOS 13 на новых iPhone. Прекрасно работает на 7 и ниже. При инициализации CLLocationManager метод CLLocationManager: didChangeAuthorizationStatus не вызывается.

Вот код:

var firstMapLoad = true
let locationManager = CLLocationManager()
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.delegate = self

....

    // MARK: - CLLocationManagerDelegate

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status:    CLAuthorizationStatus) {
        print ("locationManager: didChangeAuthorization called")
        if (CLLocationManager.locationServicesEnabled()) {
            switch status {
            case .notDetermined:
                // Request when-in-use authorization initially
                locationManager.requestWhenInUseAuthorization()
                print ("locationManager: notDetermined & requestWhenInUseAuthorization")
                break
            case .authorizedWhenInUse:
                // Enable basic location features
                locationManager.startUpdatingLocation()
                print ("locationManager: authorizedWhenInUse & startUpdatingLocation")
                break
            case .authorizedAlways:
                // Enable any of your app's location features
                //enableMyAlwaysFeatures()
                break
            case .restricted, .denied:
                //determine if system or app loc svcs disabled
                print ("locationManager: restricted or denied")
                noAppLocationService()
                break
            @unknown default:
                print("locationManager: unknown authorization state")
            }
        }else{
            viewOnlyMode()
        }
     }

     func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let GPSAccuracy:CLLocation = locations[0] as CLLocation
        print ("locationManager: didUpdateLocations")
        if let location = locations.last?.coordinate {
            if (currentLocation.latitude != location.latitude) || (currentLocation.longitude != location.longitude) {
                self.currentLocation = location
                GPSHorizontalAccuracy = GPSAccuracy.horizontalAccuracy
                //                print("LocManAccuracy: \(GPSAccuracy.horizontalAccuracy)")
                //                print("LocManLatitude: \(GPSAccuracy.coordinate.latitude)")
                //                print("LocManLongitude: \(GPSAccuracy.coordinate.longitude)")
                //                print("LocManCurrLat: \(currentLocation.latitude)")
                //                print("LocManCurrLong: \(currentLocation.longitude)")
                if firstMapLoad {
                    // Set the map’s center coordinate and zoom level.
                    let camera = GMSCameraPosition.camera(withTarget: self.currentLocation, zoom: 13)
                    self.viewMap?.animate(to: camera)
                    firstMapLoad = false;

                }
            }
        }
    }
    
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Location Error = \(error.localizedDescription)")
    }

Когда я запускаю его на симуляторе iPhone 11 Pro Max в Xcode, Если симулятор iPhone был сброшен и приложение запускалось в первый раз, я получаю предупреждение об авторизации с тремя вариантами. Я выбираю «при использовании», и приложение работает нормально - функция didChangeAuthorization вызывается дважды (один раз при инициализации диспетчера местоположения, а затем при выборе «при использовании»). Затем вызывается didUpdateLocations, и приложение получает обновления местоположения.

Если я останавливаю приложение, удаляю его из симулятора, а затем повторно запускаю из Xcode, приложение не запрашивает разрешения пользователя для служб определения местоположения. didChangeAuthorization не вызывается при инициализации диспетчера местоположения, поэтому службы определения местоположения не запускаются, и приложение не получает никаких обновлений местоположения. Я наблюдал такое же поведение на реальном iPhone 11 Pro.

Я попытался установить для приложения разрешение «никогда» в настройках местоположения приложения, остановил приложение, а затем удалил приложение на симуляторе. . Когда я в следующий раз запустил Xcode, приложение не запрашивало разрешения на определение местоположения, но отображало предупреждение о том, что службы определения местоположения отключены. Похоже, что настройки из предыдущей установки были сохранены, даже если приложение было удалено.

...