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

Когда я запускаю свое приложение, я проверяю статус авторизации текущего местоположения следующим образом:

- (void)checkCurrentStatus { if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) { [self.locationManager requestWhenInUseAuthorization]; } else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied && ![CLLocationManager locationServicesEnabled]) { [self.locationManager startUpdatingLocation]; } } 

Если общие службы определения местоположения включены (для всего устройства), чем просто запрашивают у пользователя разрешение, появляется предупреждение. Если они отключены (иначе если условие), то мне нужно вызвать startUpdatingLocation потому что вызов [self.locationManager requestWhenInUseAuthorization]; не действует, когда статус авторизации – kCLAuthorizationStatusDenied (без каких-либо условий). Хорошо, поэтому я вызываю startUpdatingLocation а затем появляется предупреждение, в котором говорится:

Включить службы определения местоположения, чтобы разрешить «AppName» определять ваше местоположение

Хорошо, я перехожу к настройкам, на которых включаются общие службы определения местоположения. После этого authorizationStatus становится kCLAuthorizationStatusNotDetermined но когда я вызываю requestWhenInUseAuthorization это не имеет никакого эффекта! Всплывающее окно не появляется, пользователю не предлагается авторизация местоположения, статус остается тем же, я не могу использовать диспетчер местоположений. Как я могу справиться с этим?

Из документа Apple в CLLocationManager о - (void)requestWhenInUseAuthorization

Если текущий статус авторизации является чем-то иным, чем kCLAuthorizationStatusNotDetermined, этот метод ничего не делает и не вызывает метод locationManager: didChangeAuthorizationStatus: method

Вот что вам нужно:

 - (void)requestAlwaysAuthorization { CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; // If the status is denied or only granted for when in use, display an alert if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusDenied) { NSString *title; title = (status == kCLAuthorizationStatusDenied) ? @"Location services are off" : @"Background location is not enabled"; NSString *message = @"To use background location you must turn on 'Always' in the Location Services Settings"; UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Settings", nil]; [alertView show]; } // The user has not enabled any location services. Request background authorization. else if (status == kCLAuthorizationStatusNotDetermined) { [self.locationManager requestAlwaysAuthorization]; } } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == 1) { // Send the user to the Settings for this app NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; [[UIApplication sharedApplication] openURL:settingsURL]; } } 

Courtesy копия этого сообщения в блоге

Interesting Posts

Нужно ли использовать self.view в UIViewController?

Создавать временные объекты CoreData (в непостоянном контексте MagicalRecord)?

не может найти объявление протокола для «CAAnimationDelegate»

Приложение отклонено по пункту 17.2. Запрос идентификатора электронной почты

Зарегистрируйтесь для изменения адресной книги, используя ABAddressBookRegisterExternalChangeCallback

Укажите URL-адрес в html для параметра закладки на iPhone.

Xcode: копирование файлов из одного проекта в другой в одном рабочем пространстве

Нужно пояснить странный синтаксис

Лучший способ определить переменные для размеров узлов на разных экранах в SpriteKit

5.0 Base SDK приложение не будет установлено на iPad с ОС 5.1

ios 8 UIIMagePickerController, показывающий черный экран предварительного просмотра, чередуя время в iPhone 6

UIAlertView: UIAlertViewStyleSecureTextInput: цифровая клавиатура

Как проверить подключение к Интернету в alamofire?

Отображение изображения в веб-браузере iOS размыто, но одно и то же изображение для изображения

Силовая портретная ориентация на iPhone с телефонной связью

Давайте будем гением компьютера.