2013-10-16 7 views
12

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

//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?

+0

didUpdateLocations метод запускается или нет? – karthika

+0

его запуск, но только один раз ... –

+0

Вы вызываете stopUpdatingLocation в этом методе? – karthika

ответ

12

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

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

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

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

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

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

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

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

+0

Что делать, если я помещаю свое приложение в фоновом режиме, переходим к POINT A, а затем останавливаемся на 20 минут. Затем я снова перехожу к POINT B.За все это время приложение все еще находится в фоновом режиме. Когда я открою свое приложение обратно в режим переднего плана, будет ли сделанаUpdateLocations дать мне все места между POINT A и POINT B? –

+0

Нет, это не будет, местоположение, которое получено чипом GPS, будет передано через метод locationManager: didUpdateLocations напрямую. Поэтому, если вы хотите сохранить путь к местоположению, вам нужно будет хранить их напрямую, когда вы их получите. – Leon

Смежные вопросы