iOs (CoreLocation) – locationManager: didUpdateLocations: no funciona como se esperaba

Escribí una aplicación de iPhone simple que recupera información de location y simplemente la muestra. Quiero boost la variable distanceTraveled cada vez que cambia la position. Mi problema es que en el método locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations , locations.count siempre es igual a uno. Pensé que agregaría un elemento a la matriz cada vez que se llama al método, pero parece que no es así …

Estoy ejecutando la aplicación en el simulador (ahora no tengo un dispositivo).

Este es mi código:

 // BIDViewController.h #import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> @interface BIDViewController : UIViewController <CLLocationManagerDelegate> @property (strong, nonatomic) CLLocationManager *locationManager; @property (strong, nonatomic) CLLocation *startingPoint; @property (strong, nonatomic) IBOutlet UILabel *latitudeLabel; @property (strong, nonatomic) IBOutlet UILabel *longitudeLabel; @property (strong, nonatomic) IBOutlet UILabel *horizontalAccuracyLabel; @property (strong, nonatomic) IBOutlet UILabel *altitudeLabel; @property (strong, nonatomic) IBOutlet UILabel *verticalAccuracyLabel; @property (strong, nonatomic) IBOutlet UILabel *distanceTraveledLabel; @end // BIDViewController.m : #import "BIDViewController.h" @interface BIDViewController () @property (strong, nonatomic)CLLocation *currentLocation; @property (strong, nonatomic)CLLocation *lastLocation; @property CLLocationDistance distanceTraveled; @end @implementation BIDViewController @synthesize latitudeLabel; @synthesize locationManager; @synthesize longitudeLabel; @synthesize startingPoint; @synthesize altitudeLabel; @synthesize distanceTraveledLabel; @synthesize horizontalAccuracyLabel; @synthesize verticalAccuracyLabel; @synthesize currentLocation; @synthesize lastLocation; @synthesize distanceTraveled; - (void)viewDidLoad { [super viewDidLoad]; locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; locationManager.desinetworkingAccuracy = kCLLocationAccuracyBest; //locationManager.distanceFilter = 10.0f; [locationManager startUpdatingLocation]; } - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { if (startingPoint == nil) { startingPoint = [locations lastObject]; NSLog(@"first time -- locations.count = %d", locations.count); distanceTraveled = 0; distanceTraveledLabel.text = @"0m"; } else if (locations.count > 1) { NSLog(@"into the else if -- locations.count = %d", locations.count); lastLocation = locations[locations.count -2]; distanceTraveled = distanceTraveled + [currentLocation distanceFromLocation:lastLocation]; distanceTraveledLabel.text = [NSString stringWithFormat:@"%gm", distanceTraveled]; } NSLog(@"locations.count = %d", locations.count); currentLocation = [locations lastObject]; latitudeLabel.text = [NSString stringWithFormat:@"%g\u00B0", currentLocation.coordinate.latitude]; longitudeLabel.text = [NSString stringWithFormat:@"%g\u00B0", currentLocation.coordinate.longitude]; horizontalAccuracyLabel.text = [NSString stringWithFormat:@"%gm", currentLocation.horizontalAccuracy]; verticalAccuracyLabel.text = [NSString stringWithFormat:@"%gm", currentLocation.verticalAccuracy]; altitudeLabel.text = [NSString stringWithFormat:@"%gm", currentLocation.altitude]; } - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { NSString *errorString = [[NSString alloc] init]; switch (error.code) { case kCLErrorLocationUnknown: errorString = @"Location unknown"; break; case kCLErrorDenied: errorString = @"Access denied"; break; case kCLErrorNetwork: errorString = @"No network coverage"; break; case kCLErrorDefernetworkingAccuracyTooLow: errorString = @"Accuracy is too low to display"; break; default: break; } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error getting location" message:errorString delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; } @end 

Así es como se ve el registrador:

 2012-11-21 11:28:34.882 WhereAmI[652:11c03] first time -- locations.count = 1 2012-11-21 11:28:34.897 WhereAmI[652:11c03] locations.count = 1 2012-11-21 11:28:35.835 WhereAmI[652:11c03] locations.count = 1 2012-11-21 11:28:36.835 WhereAmI[652:11c03] locations.count = 1 2012-11-21 11:28:37.836 WhereAmI[652:11c03] locations.count = 1 2012-11-21 11:28:38.836 WhereAmI[652:11c03] locations.count = 1 2012-11-21 11:28:39.837 WhereAmI[652:11c03] locations.count = 1 2012-11-21 11:28:40.837 WhereAmI[652:11c03] locations.count = 1 2012-11-21 11:28:41.838 WhereAmI[652:11c03] locations.count = 1 2012-11-21 11:28:42.839 WhereAmI[652:11c03] locations.count = 1 

y así…

¿Algún consejo? ¡Gracias a todos y, como siempre, perdón por el mal inglés!

Simulator no devolverá más de una location, ya que utiliza la location de su computadora, por lo que obtendrá la precisión de su Wi-Fi y eso es todo, a less que cambie a otra networking Wi-Fi en otro lugar mientras se está ejecutando, nunca debería devolver una mayor precisión / location diferente.

Si estás probando un dispositivo real que se mueve, o si el dispositivo primero te da la precisión de la torre de la célula, luego Wi-Fi, luego la precisión del GPS, recibirás más de una location en la matriz.

Espero que esto lo aclare.