Если службы определения местоположения отключены, CLLocationManager никогда не обновляется - PullRequest
2 голосов
/ 18 января 2012

Если пользователь отключил службы определения местоположения (либо для всех приложений, либо только для меня), CLLocationManager никогда не запрашивает и никогда не обновляет позицию. Этого и следовало ожидать, но есть ли способ обнаружить, что службы определения местоположения отключены, и предложить повторно включить его?

Ответы [ 4 ]

9 голосов
/ 18 января 2012

Согласно документам , в CLLocationManager есть статический метод, позволяющий определить, включены ли LocationServices:

+ (BOOL)locationServicesEnabled
5 голосов
/ 18 января 2012

Просто чтобы завершить ответ Тима.

Всегда можно попробовать запустить обновление местоположения с помощью метода startUpdatingLocation в экземпляре CLLocationManager. Если службы определения местоположения отключены, вы получите уведомление об ошибке от делегата, а затем сможете вызвать диалоговое окно с просьбой перейти в «Настройки» и включить службы определения местоположения для вашего приложения ...

#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)inManager didFailWithError:(NSError *)inError{
    if (inError.code ==  kCLErrorDenied) {
        NSLog(@"Location manager denied access - kCLErrorDenied");
        // your code to show UIAlertView telling user to re-enable location services
        // for your app so they can benefit from extra functionality offered by app
    }
}

Обратите внимание, что вы можете запустить приложение «Настройки» через URL-схему на iOS5 (версии ниже 5.0 (и выше 5.0), не поддерживают его). Звоните:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"]];
1 голос
/ 18 января 2012

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

Вот фрагмент кода, который я использую:

if (TARGET_IPHONE_SIMULATOR) {
    currentLocation = [[CLLocation alloc] initWithLatitude:37.331718 longitude:-122.030629];
    [self methodNameHere:currentLocation];
} else {
    if ([CLLocationManager locationServicesEnabled]) {
        [locationManager startUpdatingLocation];
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Location Services Disabled" message:@"Enable location services to do this" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];
        [alert release];
    }
}

По сути, код проверяет, нацелены ли вы на симулятор, который может выдавать вам ошибки, если вы пытаетесь получить местоположение, поэтому вместо этого я просто жестко кодирую местоположение, которое хочу смоделировать (в данном случае, Apple HQ) , При нацеливании на устройство он проверяет, включены ли службы определения местоположения, если это так, он вызывает метод, который вы хотите выполнить, если нет, он показывает пользователю сообщение с предупреждением.

0 голосов
/ 06 мая 2015

Я думаю, что лучший способ приблизиться к этому - это сделать:

switch ([CLLocationManager authorizationStatus]) {
    case kCLAuthorizationStatusAuthorizedWhenInUse:
    case kCLAuthorizationStatusAuthorizedAlways:
        //we're good to go
        break;
    default:
        //pop up an alert
        break;
}
...