IOS 6 CoreLocation не работает

Я создаю приложение для местоположения. Но Core Location не работает. Я тестировал другое приложение iPhone на своем iPhone.
Как Google Earth, навигационное программное обеспечение. Другие приложения также не работают.
Почему не обновляется местоположение?
Почему 'locationManager: didUpdateToLocation: fromLocation:' сообщение называется только 2 раза?

Может быть... Мой iPhone сломан? или iOS 6 CoreLocation имеют некоторую ошибку?

Служба определения местоположения - в настройках iPhone

Info.plist

  • ARMv7
  • акселерометр
  • место-услуги
  • GPS
  • микрофон
  • магнитометр

Пример кода:

- (CLLocationManager *)setupLocationManager
{
  if ([CLLocationManager locationServicesEnabled] && [CLLocationManager headingAvailable]) {

     CLLocationManager *locationManager = [[CLLocationManager alloc] init];
     locationManager.delegate = self;
     locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
     locationManager.distanceFilter = kCLDistanceFilterNone;
     locationManager.headingFilter = kCLHeadingFilterNone;
     [locationManager startUpdatingLocation];
     [locationManager startUpdatingHeading];
     return locationManager;
  }
  return nil;
}

- (CLLocationManager *)locationManager
{
  switch([CLLocationManager authorizationStatus])
  {
    case kCLAuthorizationStatusAuthorized:
      _deltaTimeLocationReceived = 0.0;
      if (_locationManager == nil)
        _locationManager = [self setupLocationManager];
       return _locationManager;

      case kCLAuthorizationStatusDenied:
      case kCLAuthorizationStatusRestricted:
        if (_locationManager)
          _locationManager = nil;
        return _locationManager;

      case kCLAuthorizationStatusNotDetermined:
        _deltaTimeLocationReceived = 0.0;
        if (_locationManager == nil)
          _locationManager = [self setupLocationManager];
        return nil;
    }
    return nil;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
  NSLog(@"%@ %@", NSStringFromSelector(_cmd), newLocation.description); 
  if (self.locationManager) _locationSignal++;
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
  NSLog(@"%@ %@", NSStringFromSelector(_cmd), error.description);
}

Ответ 1

В iOS 6 Apple внесло изменения в Core Location, реализовав API AutoPause. API AutoPause приостанавливает обновление местоположения, когда приложение переходит в фоновый режим и применяется к нескольким критериям (т.е. Пользователь не перемещается, не фиксирует местоположение, пользователь прекращает активность). Чтобы точно обрабатывать события приостановки, Apple запрашивает, чтобы лучше прогнозировать, приостанавливать или не приостанавливать обновления местоположения, задавая тип активности (например, навигация, фитнес, другое). API AutoPause включен по умолчанию, когда приложение скомпилировано против iOS 6.

Простое исправление - отключить API AutoPause на данный момент, всегда устанавливая "pausesLocationUpdatesAutomatically" на NO. Обновления местоположения будут отправляться, даже когда приложение переходит в фоновом режиме, например, оно использовалось для работы в < iOS 6.

Подробнее здесь:

http://developer.apple.com/library/ios/#documentation/CoreLocation/Reference/CLLocationManager_Class/CLLocationManager/CLLocationManager.html

Ответ 2

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation Делегат больше не существует в ios 6.

Вместо этого используйте

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray*)locations

Отметьте Документацию Apple для startUpdateLocation

Этот код (и pausesLocationUpdatesAutomatically) будет компилироваться только в XCode 4.5 (где базовый SDK равен 6).

Если вы хотите настроить таргетинг на версии iOS до 6.0, используйте этот макрос

#define IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

и везде, где вы создаете объект CLLocationManager

if(IOS_VERSION_GREATER_THAN_OR_EQUAL_TO (@"6.0"))
{
    locationManagerObj.pausesLocationUpdatesAutomatically = NO;
}

Делегатор locationManager должен работать во всех версиях при компиляции из Xcode 4.5

Ответ 3

Есть ли у вас сообщение из метода делегата?

Если сообщение отсутствует, проверьте описание интерфейса класса.

@interface... <... CLLocationManagerDelegate... >