Как вы определяете с CLLocationManager, когда пользователь отказывает в доступе к службам определения местоположения? - PullRequest
1 голос
/ 13 марта 2010

С CLLocationManager я могу использовать следующий код, чтобы определить, могу ли я получить доступ к службам определения местоположения на устройстве. Это основная настройка для всех приложений, которую можно включать и выключать.

if (self.locationManager.locationServicesEnabled) {
    [self.locationManager startUpdatingLocation];
}

Но пользователь может отказать в доступе к отдельному приложению, и чтобы не выполнять код для использования диспетчера местоположений, мне нужно знать, одобрил ли пользователь доступ к службам определения местоположения для этого конкретного приложения. Я видел, что в какой-то момент было свойство с именем locationServicesApproved, которое, по-видимому, будет указывать, одобрил ли пользователь доступ к службам определения местоположения в этом приложении. Но он был удален в 2008 году.

Источник: http://trailsinthesand.com/apple-removes-notifications-from-iphone-sdk-beta-4/

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

Эта функция в SDK где-либо еще? Что можно сделать, чтобы определить, разрешил ли пользователь доступ к службам определения местоположения для текущего приложения?

Ответы [ 3 ]

4 голосов
/ 04 октября 2010

Из этого ответа SO: тест locationServicesEnabled проходит, когда они отключены в viewDidLoad

Метод класса locationServicesEnabled проверяет только глобальные параметры для услуг определения местоположения. AFAIK, нет способа проверить, есть ли в вашем приложении явно было отказано. Вам придется подождать запрос местоположения потерпеть неудачу и использовать метод CLLocationManagerDelegate locationManager: didFailWithError: делать все, что вам нужно. Э.Г.

- (void)locationManager: (CLLocationManager *)manager
       didFailWithError: (NSError *)error {

    NSString *errorString;
    [manager stopUpdatingLocation];
    NSLog(@"Error: %@",[error localizedDescription]);
    switch([error code]) {
        case kCLErrorDenied:
            //Access denied by user
            errorString = @"Access to Location Services denied by user";
            //Do something...
            break;
        case kCLErrorLocationUnknown:
            //Probably temporary...
            errorString = @"Location data unavailable";
            //Do something else...
            break;
        default:
            errorString = @"An unknown error has occurred";
            break;
        }
    }

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:errorString delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
    [alert show];
    [alert release];
}

См. Документацию по константам CLError в Ссылка на класс CLLocationManager для дополнительных параметров.

0 голосов
/ 10 апреля 2015

Начиная с iOS 4.2, вы можете использовать глобальный метод + (CLAuthorizationStatus)authorizationStatus из CLLocationManager:

if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
    //User denied access to location service for this app
}
0 голосов
/ 19 марта 2010

Я ответил на свой вопрос в комментарии к вопросу выше.

Ответ (скопировано из комментария выше):

Похоже, что вам нужно дождаться вызова locationManager: didFailWithError: и код ошибки будет указывать на значения в CLError.h. Значения: kCLErrorLocationUnknown, kCLErrorDenied, kCLErrorNetwork и kCLErrorHeadingFailure. Похоже, что второе значение - это то, что я должен проверить, чтобы убедиться, что пользователь запретил доступ к службам определения местоположения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...