Swift4 - Проверить авторизацию местоположения при любом запуске приложения [дубликат]

A NumberFormatException означает, что Integer.parseInt() не может перевести строку в число.

Я бы предложил один из двух вариантов:

  1. Инкапсулировать карты как имя (строка) / значение (int) комбо. Используйте значение для сравнения и имя для предоставления информации пользователю. Cards[] затем становится списком карт, а не строками.
  2. Соберите сами строки. Это может быть проще, поскольку вы уже сделали это с битами if(cards[index].startsWith("Ace")) { value = 1; }. Вы можете переместить их в функцию под названием CardToInt() (или что-то еще) и использовать эту функцию вместо Integer.parseInt().
47
задан Rashwan L 16 October 2016 в 04:35
поделиться

8 ответов

Добавьте CLLocationManagerDelegate к вашему наследованию класса, а затем вы можете выполнить эту проверку: Swift 1.x - 2.x версия:

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")
}

версия Swift 3.0:

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")
}
141
ответ дан Tamás Sengel 18 August 2018 в 14:29
поделиться
  • 1
    Ага! Благодаря! Моя проблема заключалась в том, что я пытался вызвать locatoinServicesEnabled на моем менеджере, то есть manager.locationServicesEnabled(), а не CLLocationManager.loationServicesEnabled() Solved! – Brendan Chang 18 January 2016 в 20:24
  • 2
    Я понимаю, что ваш код - всего лишь пример, но он немного вводит в заблуждение ... Я думаю, что лучше, когда authorizationStatus будет установить на notDetermined, а вместо того, чтобы просто регистрировать, было бы лучше запросить пользователь «Разрешить / Не разрешать»; – Honey 1 May 2017 в 19:25
  • 3
    @Honey, конечно, вы, конечно, можете использовать его, как хотите, и, как вы сказали, код просто пример, чтобы показать, как его можно использовать. – Rashwan L 1 May 2017 в 19:28

SWIFT (по состоянию на 24 июля 2018 года)

if CLLocationManager.locationServicesEnabled() {

}

это скажет вам, что пользователь уже установил настройку для местоположения

7
ответ дан BennyTheNerd 18 August 2018 в 14:29
поделиться

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

yourSharedLocationManager.requestWhenInUseAuthorization()

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

Для определения текущих разрешений необходимо проверить два отдельных состояния.

  • Если у пользователя есть общие службы определения местоположения или нет

CLLocationManager.locationServicesEnabled()

  • Если пользователь предоставил правильное разрешение для вашего приложения ..

CLLocationManager.authorizationStatus() == .authorizedWhenInUse

Вы можете добавить расширение - это удобная опция:

extension CLLocationManager {
static func authorizedToRequestLocation() -> Bool {
    return CLLocationManager.locationServicesEnabled() &&
        (CLLocationManager.authorizationStatus() == .authorizedAlways || CLLocationManager.authorizationStatus() == .authorizedWhenInUse)
}

}

Здесь он обращается, когда пользователь сначала запросил направления:

 private func requestUserLocation() {
    //when status is not determined this method runs to request location access
    locationManager.requestWhenInUseAuthorization()

    if CLLocationManager.authorizedToRequestLocation() {

        //have accuracy set to best for navigation - accuracy is not guaranteed it 'does it's best'
        locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation

        //find out current location, using this one time request location will start the location services and then stop once have the location within the desired accuracy -
        locationManager.requestLocation()
    } else {
        //show alert for no location permission
        showAlertNoLocation(locationError: .invalidPermissions)
    }
}

Вот делегат:

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

    if !CLLocationManager.authorizedToRequestLocation() {
        showAlertNoLocation(locationError: .invalidPermissions)
    }
}
1
ответ дан Jess 18 August 2018 в 14:29
поделиться
6
ответ дан Marosdee Uma 18 August 2018 в 14:29
поделиться

В Swift 3.0

if (CLLocationManager.locationServicesEnabled())
            {
                locationManager.delegate = self
                locationManager.desiredAccuracy = kCLLocationAccuracyBest
                if ((UIDevice.current.systemVersion as NSString).floatValue >= 8)
                {
                    locationManager.requestWhenInUseAuthorization()
                }

                locationManager.startUpdatingLocation()
            }
            else
            {
                #if debug
                    println("Location services are not enabled");
                #endif
            }
1
ответ дан Rob-4608 18 August 2018 в 14:29
поделиться

Когда вы вызываете -startLocation, если службы определения местоположения были отклонены пользователем, делегат менеджера местоположений получит вызов - locationManager:didFailWithError: с кодом ошибки kCLErrorDenied. Это работает как во всех версиях iOS.

3
ответ дан Shaheen Sharifian 18 August 2018 в 14:29
поделиться
  • 1
    Благодарю. К сожалению, когда я это пробовал, он показывает: Use of unresolved identifier 'kCLErrorDenied'. Мысли? – Brendan Chang 18 January 2016 в 20:00

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

    import CoreLocation

    open class Reachability {
        class func isLocationServiceEnabled() -> Bool {
            if CLLocationManager.locationServicesEnabled() {
                switch(CLLocationManager.authorizationStatus()) {
                    case .notDetermined, .restricted, .denied:
                    return false
                    case .authorizedAlways, .authorizedWhenInUse:
                    return true
                    default:
                    print("Something wrong with Location services")
                    return false
                }
            } else {
                    print("Location services are not enabled")
                    return false
              }
            }
         }

, а затем используйте его в своем VC

    if Reachability.isLocationServiceEnabled() == true {
    // Do what you want to do.
    } else {
    //You could show an alert like this.
        let alertController = UIAlertController(title: "Location 
        Services Disabled", message: "Please enable location services 
        for this app.", preferredStyle: .alert)
        let OKAction = UIAlertAction(title: "OK", style: .default, 
        handler: nil)
        alertController.addAction(OKAction)
        OperationQueue.main.addOperation {
            self.present(alertController, animated: true, 
            completion:nil)
        }
    }
4
ответ дан Sri Hari YS 18 August 2018 в 14:29
поделиться

Это всего лишь 2-строчная функция в Swift 4:

import CoreLocation

static func isLocationPermissionGranted() -> Bool
{
    guard CLLocationManager.locationServicesEnabled() else { return false }
    return [.authorizedAlways, .authorizedWhenInUse].contains(CLLocationManager.authorizationStatus())
}
4
ответ дан Suat KARAKUSOGLU 18 August 2018 в 14:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: