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 копия этого сообщения в блоге

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