Местоположение iOS7 Core не обновляется

У меня есть очень простой пример приложения, который инициализирует и обновляет местоположение пользователей. На устройстве он успешно выбрасывает другое место обратного вызова каждую секунду или около того, однако на устройстве (iPhone, на котором работает iOS7) вызывает метод один раз, а затем загадочно останавливается..

//Setup Location Manager in ViewDidLoad
locationManager = [[CLLocationManager alloc] init];
[locationManager setDistanceFilter:kCLDistanceFilterNone];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDelegate:self];
[locationManager startUpdatingLocation];

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
     NSLog(@"location services not turned on");
}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
     NSLog(@"loactions %@", locations);
}

-(void)locationManager:(CLLocationManager *)manager
   didUpdateToLocation:(CLLocation *)newLocation
          fromLocation:(CLLocation *)oldLocation
{

    NSLog(@"new location %f, and old %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude);
}

В iOS6 это приложение отлично работало и постоянно обновляло местоположение устройств... Что изменилось с iOS7?

Ответ 1

Здесь есть несколько вещей:

1- Я не вижу в любом месте свойства: pausesLocationUpdatesAutomatically. По умолчанию для этого свойства установлено значение "Да". Это означает, что в зависимости от вашего вида активности (см. № 2), GPS будет приостанавливать обновления, и это может быть причиной того, что вы не получаете обновления. Алгоритм - это черный ящик, который знает только Apple, и, возможно, он каким-то образом изменился между iOS6 и iOS7. Настройка pausesLocationUpdatesAutomatically NO может повлиять на аккумулятор.

2- Вы должны установить свой тип активности в зависимости от вашего приложения. По умолчанию CLActivityTypeOther, который я не уверен, как это влияет на алгоритм GPS и № 1 выше. Поэтому, чтобы сначала протестировать ваше приложение, я бы правильно установил activityType и изменил pausesLocationUpdatesAutomatically на Нет. В моем тесте я получал обновление каждую секунду последовательно (я тестировал его в одночасье).

3- Проверка обновлений мест требует движения. Чтобы получить лучшие результаты, я бы использовал тип activityType для тестирования. Другими словами, если activityType - CLActivityTypeFitness, я бы прошел, чтобы проверить его и т.д.

4- locationManager сделалUpdateToLocation fromLocation устарел в iOS7. Кроме того, если locationManager сделалUpdateLocations реализован, первый не будет вызываться. Таким образом, в вашем случае выше, locationManager didUpdateToLocation fromLocation не вызывается.

5- Нет реальной разницы в использовании аккумулятора между kCLLocationAccuracyBestForNavigation и kCLLocationAccuracyBest. С другой стороны, kCLLocationAccuracyBestForNavigation использует GPS с максимальной скоростью и, кроме того, объединяет его с данными акселерометра.

Итак, я бы начал с настройки activityType, установив pausesLocationUpdatesAutomatically на NO и изменив требуемую функцию на kCLLocationAccuracyBestForNavigation. После того, как вы будете получать непрерывные обновления, я бы установил pausesLocationUpdatesAutomatically на "Да" и попытался выполнить код для достижения того же удобства использования приложений.

Надеюсь, что это поможет