Как обрабатывать, когда пользователь не разрешает местоположение

#swift #xcode

#swift #xcode

Вопрос:

В настоящее время я играю со службами определения местоположения на iPhone и создал контроллер просмотра с помощью одной кнопки.

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

  @IBAction func requestLocation(_ sender: AnyObject) {
    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
    self.locationManager.requestWhenInUseAuthorization()
    self.locationManager.startUpdatingLocation()
    checkLocation()
}
  

Я также вызвал свою функцию checkLocation(), которая проверяет статус авторизации для этого, но она вызывается до того, как пользователь получит возможность разрешить или запретить запрос.

 func checkLocation() {
    if CLLocationManager.locationServicesEnabled() {
        switch(CLLocationManager.authorizationStatus()) {
        case .notDetermined, .restricted, .denied:
            print("No access")
        case .authorizedAlways, .authorizedWhenInUse:
            print("Access")
        }
    } else {
        print("Location services are not enabled")
    }
}
  

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

Комментарии:

1. Если пользователь нажимает «разрешить», а местоположение отключено, тогда перейдите к настройкам конфиденциальности, а если пользователь нажимает «запретить» — ничего не делайте и закройте оповещение

2. Как мне на самом деле реализовать проверки, чтобы увидеть, нажимает ли пользователь разрешить? Извините, в моем вопросе должно быть более ясно.

Ответ №1:

Когда вы добавили NSRequestWhenInUse в свой файл info.plist, системное оповещение будет отображаться при первом открытии приложения. В этом предупреждении есть два варианта «Разрешить» и «Отменить». Поэтому, когда пользователь нажимает разрешить, он переходит в настройки, а когда пользователь включает местоположение, ваше приложение обновит местоположение пользователя. Таким образом, вам не нужно ничего делать вручную.

введите описание изображения здесь

И добавьте этот метод,

 func locationManager(_ manager: CLLocationManager, didFailWithError error: Error?) {
    // [manager stopUpdatingLocation];
    print("error(error)")
    switch error!.code {
        case kCLErrorNetwork:
        // general, network-related error
                        var alert = UIAlertView(title: "Location Error!", message: "Can't access your current location! Please check your network connection or that you are not in airplane mode!", delegate: nil, cancelButtonTitle: "Ok", otherButtonTitles: "")
            alert.show()

        case kCLErrorDenied:
                        var alert = UIAlertView(title: "Location Error!", message: "Location Access has been denied for app name!", delegate: nil, cancelButtonTitle: "Ok", otherButtonTitles: "")
            // alert.tag=500;
            alert.show()

        default:
                        var alert = UIAlertView(title: "Location Error!", message: "Can't access your current location!", delegate: nil, cancelButtonTitle: "Ok", otherButtonTitles: "")
  

Комментарии:

1. Я пытаюсь напечатать что-то в журналах, когда пользователь нажимает не разрешать

2. Value of type 'Error' has no member 'code' у вас есть обновленный код?