iOS7 Core Location не обновляется
У меня есть очень простой пример приложения, который инициализирует и обновляет местоположение пользователя. На устройстве оно успешно выбрасывает другое местоположение обратного вызова каждую секунду или около того, однако на устройстве (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- Я нигде не вижу свойства: pausesLocationUpdatesAutomatics. Значение по умолчанию для этого свойства - Да. Это означает, что в зависимости от вашего ActivityType (см. № 2) ниже, GPS будет приостанавливать обновления, и это может быть причиной того, что вы не получаете обновления. Алгоритм представляет собой черный ящик, который знает только Apple, и, возможно, он каким-то образом изменился между iOS6 и iOS7. Установка паузыРасположениеОбновленияАвтоматически НЕТ может повлиять на батарею.
2- Вы должны установить свой тип активности в зависимости от вашего приложения. По умолчанию это CLActivityTypeOther, который я не уверен, как это повлияет на алгоритм GPS и № 1 выше. Таким образом, чтобы сначала протестировать ваше приложение, я бы соответствующим образом установил ActivityType и изменил pausesLocationUpdatesAutomatics на Нет. В моем тесте я получал бы обновление примерно каждую секунду (я тестировал его всю ночь).
3- Тестирование обновлений местоположения требует движения. Чтобы получить лучшие результаты, я бы использовал заданный вами тип активности для тестирования. Другими словами, если ActivityType - это CLActivityTypeFitness, я хотел бы протестировать его и т. Д.
4 - locationManager didUpdateToLocation fromLocation устарела в iOS7. Кроме того, если locationManager didUpdateLocations реализован, первый не будет вызван. Так что в вашем случае выше, locationManager didUpdateToLocation fromLocation не вызывается.
5. Нет реальной разницы в использовании батареи между kCLLocationAccuracyBestForNavigation и kCLLocationAccuracyBest. С другой стороны, kCLLocationAccuracyBestForNavigation использует GPS с максимальной скоростью и, кроме того, объединяет его с данными акселерометра.
Поэтому я бы начал с установки activityType, установки pausesLocationUpdatesAutomatics на NO и изменения желаемой точности на kCLLocationAccuracyBestForNavigation. Как только вы получаете постоянные обновления, я бы установил для pausesLocationUpdatesAutomatics значение Yes и попытался бы обработать код для достижения того же удобства использования приложения.
Надеюсь это поможет