Swift 4 - Обновить вид после обновления настроек конфиденциальности CLLocationManager - PullRequest
0 голосов
/ 10 ноября 2018

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

Есть ли функция, которую можно запустить после того, как пользователь вернется в приложение со страницы настроек, которая обновит и начнет обновлять местоположение.

Я ценю любой совет или помощь. Спасибо.

Пользователь видит предупреждение: alert image

ПОСЛЕ ТОГО, КАК ПОЛЬЗОВАТЕЛЬ НАЖИМАЕТ ОБРАТНО К ПРИЛОЖЕНИЮ, СТРАНИЦА ДОЛЖНА ОБНОВЛЯТЬСЯ, ЧТОБЫ ОБНОВИТЬ РАСПОЛОЖЕНИЕ НА КАРТЕ: enter image description here

func alertForNoLocationAccess(){

    let alert = UIAlertController(title: "Allow Location Access", message: "Cannot add location data and map coordinates to your entries without access. Press settings to update or cancel to deny access.", preferredStyle: .alert)

    alert.addAction(UIAlertAction(title: "Settings", style: .default, handler: { action in

        if let url = URL(string:UIApplication.openSettingsURLString) {
            if UIApplication.shared.canOpenURL(url) {
                if #available(iOS 10.0, *) {
                    UIApplication.shared.open(url, options: [:], completionHandler: nil)
                } else {
                    UIApplication.shared.openURL(url)
                }
            }
        }

    }))

    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))

    self.present(alert, animated: true)
}

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Проверьте документацию Apple, и вы найдете это:

"Когда вы запрашиваете авторизацию или когда авторизация вашего приложения изменения статуса, используйте locationManager (_: didChangeAuthorization :) метод вашего делегата объекта для обработки изменений. Листинг 3 показывает реализация этого метода, который включает или отключает функции на основе текущего уровня авторизации приложения. "

Очевидно, что этот метод делегата также будет запущен, если пользователь решит отключить ваше разрешение на получение данных о местоположении.

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

0 голосов
/ 14 ноября 2018

Реализация метода делегата CLLocationManagerDelegate

// MARK: - CLLocationManagerDelegate
    extension LocationTracker: CLLocationManagerDelegate {

        func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
            print(locations)
            guard let location = locations.first else { return }
            lastLocation = location
            print(LocationTracker.shared.lastLocation)
            print("location = \(location.coordinate.latitude) \(location.coordinate.longitude)")
            locateMeCallback?(location)
        }

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

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

    }

/// enableLocationService работает следующим образом

func enableMyAlwaysFeatures() {
        locationManager.allowsBackgroundLocationUpdates = true
        locationManager.pausesLocationUpdatesAutomatically = true
        locationManager.startUpdatingLocation()
        locationManager.delegate = self
    }
0 голосов
/ 10 ноября 2018

Зарегистрируйте ViewController/AppDelegate до NotificationCenter, чтобы уведомить пользователя о том, что пользователь открыл приложение с Settings.

NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)

Когда пользователь открывает приложение, запросите обновление местоположения еще раз до CLLocationManager. Если пользователь уже принял запрос, CLLocationManager начнет обновлять местоположение пользователя без прерывания.

@objc func willEnterForeground() {

    //Register for
    registerForLocationUpdates()
}

func registerForLocationUpdates() {

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

    if CLLocationManager.locationServicesEnabled() {

        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        locationManager.startUpdatingLocation()
    }
}
...