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 это не имеет никакого эффекта! Всплывающее окно не появляется, пользователю не предлагается авторизация местоположения, статус остается тем же, я не могу использовать диспетчер местоположений. Как я могу справиться с этим?

One Solution collect form web for “CLLocationManager не отображает всплывающее окно, если службы определения местоположения ранее были отключены”

Из документа 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

Не удалось показать onComingCall ViewController для моего приложения VoIP для iOS

Родная анимация в iOS

Xcode 9 Storyboard: произошла внутренняя ошибка. возможности редактирования могут быть ограничены

Блокировка UISearchBar в верхней части UITableView, например Game Center

UIBarButtonItem init с настраиваемым селектором представлений не работает должным образом

Обновлено до Xcode 7.0.1 и у проекта теперь есть проблемы

UITapGestureRecognizer в UIScrollView

Исключить путь исключения UITextView textContainer, если полная ширина и расположение в верхней части textContainer

Скопировать png-ошибку с кодом выхода 5

Apple Mach-O Linker Ошибка armv7s & libGoogleAdMobAds.a

Сообщение SIGABRT только с iOS5

слияние uilabel и uiimageview

Как проверить и обновить состояние токена Facebook в iOS SDK 3.0?

Как жесты multi-touch в iOS ведут себя, если задействовано более двух пальцев?

при использовании CMDeviceMotion, если устройство находится прямо (pitch = 90), это действительно неустойчиво. В любом случае, чтобы решить это?

PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.