2

Я попытался получить широту и долготу пользователя, но получил результат 0.000000 - я пробовал следующий код.Не удается получить местоположение пользователя в iOS 8 с помощью CLLocation Manager?

  • Я назначил переменную менеджера местоположения.
  • Менеджер местоположения выделен и установлен делегат сам.
  • Проверено подтверждение проверки версии 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

+0

Пожалуйста редактировать свой пост, чтобы сделать его доступным для чтения ... – Antzi

ответ

5

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

+0

Для по какой-то причине 'NSLocationWhenInUseUsageDescription' был добавлен в мой plist как' BOOL' по умолчанию. Службы местоположения в моем приложении работали так, как ожидалось, но выбрав «Настройки-> MyApp-> Privacy-> Location Services», вызвали сбой Settings.app. Изменение типа значения «NSLocationWhenInUseUsageDescription» на строку (даже без фактического значения) устранило сбой. – Keller

2

#define IS_OS_8_OR_LATER ([[[UIDevice CurrentDevice] SystemVersion] floatValue]> = 8.0) - (недействительными) 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]; 

}

#pragma знак - 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

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

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

enter image description here

1

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

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

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

В файл Info.plist необходимо добавить любой или оба из нижеследующих ключей.

  1. NSLocationWhenInUseUsageDescription
  2. NSLocationAlwaysUsageDescription

Это строкового типа и значением может быть любое описание сообщения или пустым.

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

  1. [self.locationManager requestWhenInUseAuthorization]
  2. [self.locationManager requestAlwaysAuthorization]
Смежные вопросы