Как получить точный статус авторизации службы определения местоположения?

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


person debuggenius    schedule 12.12.2014    source источник


Ответы (3)


Я сделал эти две функции для проверки каждого случая


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

+ (BOOL) isLocationDisableForMyAppOnly
{
    if([CLLocationManager locationServicesEnabled] &&
       [CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied)
    {
        return YES;
    }

    return NO;
}

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

+ (BOOL) userLocationAvailable {
    return [CLLocationManager locationServicesEnabled];
}

И я использую его так,

if([UserLocation userLocationAvailable]) {
    //.... Get location.
}
else
{
    if([UserLocation isLocationDisableForMyAppOnly]) {
        //... Location not available. Denied accessing location.
    }
    else{
        //... Location not available. Enable location services from settings.
    }
}

P.S. UserLocation — это пользовательский класс для определения местоположения пользователя.

person Hemang    schedule 12.12.2014

Свифт

Использовать:

CLLocationManager.authorizationStatus()

Получить статус авторизации. Это CLAuthorizationStatus, вы можете включить другой статус следующим образом:

let status = CLLocationManager.authorizationStatus()
switch status {
    case .authorizedAlways:
        <#code#>
    case .authorizedWhenInUse:
        <#code#>
    case .denied:
        <#code#>
    case .notDetermined:
        <#code#>
    case .restricted:
        <#code#>
}
person Wiingaard    schedule 16.10.2017
comment
как я могу узнать, что выбрал пользователь? АКА, как я могу узнать, когда пользователь выбрал что-то из модального окна разрешения... для доступа к вашему местоположению? - person Daniel Springer; 27.08.2018

Свифт:

Я сделал эти две функции для проверки каждого случая

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

class func isLocationDisableForMyAppOnly() -> Bool {
    if CLLocationManager.locationServicesEnabled() && CLLocationManager.authorizationStatus() == .denied {
        return true
    }
    return false
}

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

class func userLocationAvailable() -> Bool {
    return CLLocationManager.locationServicesEnabled()
}

И я использую его так,

if UserLocation.userLocationAvailable() {
        //.... Get location.
} else {
    if UserLocation.isLocationDisableForMyAppOnly() {
        //... Location not available. Denied accessing location.
    } else {
        //... Location not available. Enable location services from settings.
    }
}

P.S. UserLocation — это пользовательский класс для определения местоположения пользователя.

person Hemang    schedule 07.06.2017