Не удается получить местоположение пользователя в iOS 8 с помощью CLLocation Manager?

Я попытался получить широту и долготу пользователя, но получил результат 0,000000 - я пробовал следующий код.

  • Я назначил переменную диспетчера местоположения.
  • Диспетчер местоположения выделил и установил делегата самостоятельно.
  • Проверен запрос проверки версии iOS 8.
  • Использование функции местоположения для запуска обновления местоположения.

Код:

locationmanager=[[CLLocationManager alloc]init];
locationmanager.delegate=self;
// check before requesting, otherwise it might crash in older version
if ([locationmanager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {

    [locationmanager requestWhenInUseAuthorization];

}
[locationmanager startUpdatingLocation];

#pragma mark - CLLocationManagerDelegate
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    NSLog(@"locations %@",locations);
    CLLocation*location = [locations lastObject];
    NSLog(@"location %f",location.coordinate.latitude);
}   

Результат:2014-10-15 11:10:20.118 Хорошая [714:25676] широта 0.000000


person MOHAN.C    schedule 15.10.2014    source источник
comment
Пожалуйста, отредактируйте сообщение, чтобы его можно было прочитать...   -  person Antzi    schedule 15.10.2014


Ответы (3)


Убедитесь, что вы добавили следующие строки NSLocationWhenInUseUsageDescription или NSLocationAlwaysUsageDescription в файле .plist.

person Gireesh K    schedule 15.10.2014
comment
По какой-то причине NSLocationWhenInUseUsageDescription был добавлен в мой plist как BOOL по умолчанию. Службы определения местоположения в моем приложении работали должным образом, но выбор Settings->MyApp->Privacy->Location Services привел к сбою Settings.app. Изменение типа значения NSLocationWhenInUseUsageDescription на строку (даже без фактического значения) устранило сбой. - person Keller; 21.10.2014

#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) - (void)viewDidLoad {

[super viewDidLoad];
self.locationManager = [[CLLocationManager alloc] init];

self.locationManager.delegate = self;
if(IS_OS_8_OR_LATER){
    NSUInteger code = [CLLocationManager authorizationStatus];
    if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) {
        // choose one request according to your business.
        if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){
            [self.locationManager requestAlwaysAuthorization];
        } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) {
            [self.locationManager  requestWhenInUseAuthorization];
        } else {
            NSLog(@"Info.plist does not contain NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription");
        }
    }
}
[self.locationManager startUpdatingLocation];

}

#метка прагмы — CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError: %@", error);
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    NSLog(@"didUpdateToLocation: %@", newLocation);
    CLLocation *currentLocation = newLocation;

    if (currentLocation != nil) {
        longitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
        latitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];
    }
}

В iOS 8 вам нужно сделать две дополнительные вещи, чтобы местоположение работало: добавить ключ в свой Info.plist и запросить авторизацию у менеджера местоположения, чтобы он запустился. Есть два ключа Info.plist для авторизации нового местоположения. Требуется один или оба этих ключа. Если ни одного из ключей нет, вы можете вызвать startUpdatingLocation, но менеджер местоположений на самом деле не запустится. Он также не будет отправлять делегату сообщение об ошибке (поскольку он никогда не запускался, он не может выйти из строя). Это также не удастся, если вы добавите один или оба ключа, но забудете явно запросить авторизацию. Итак, первое, что вам нужно сделать, это добавить один или оба следующих ключа в ваш файл Info.plist:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

Оба этих ключа принимают строку

который является описанием того, почему вам нужны службы определения местоположения. Вы можете ввести строку типа «Требуется местоположение, чтобы узнать, где вы находитесь», которую, как и в iOS 7, можно локализовать в файле InfoPlist.strings.

введите здесь описание изображения

person Adarsh G J    schedule 22.12.2014

В iOS 8 этот код завершается автоматически, т. е. вы не получите никаких ошибок или предупреждений.

Вам нужно сделать две дополнительные вещи, чтобы местоположение работало:

  1. Добавить ключ в свой Info.plist
  2. Запросить авторизацию у менеджера местоположения с просьбой начать.

Любой один или оба приведенных ниже ключа необходимо добавить в файл Info.plist.

  1. NSLocationWhenInUseUsageDescription
  2. NSLocationAlwaysUsageDescription

Они имеют тип String, и значение может быть любым описанием сообщения или пустым.

Теперь вам нужно запросить авторизацию для соответствующего метода определения местоположения. Используйте любой из следующих вызовов:

  1. [self.locationManager requestWhenInUseAuthorization]
  2. [self.locationManager requestAlwaysAuthorization]
person Jayprakash Dubey    schedule 12.02.2015