iphone gps core-location 3g

iphone - iOS CoreLocation no funciona en 3G solo en EE. UU.



gps core-location (2)

Mi aplicación no puede determinar las coordenadas lat / long sobre 3G en América del Norte. Funciona perfectamente cuando está conectado a Wi-Fi. Esto se ha confirmado con AT & T y Verizon con iOS 5. En el Reino Unido funciona como se esperaba tanto en 3G como en Wi-Fi con o2.

Estoy realmente perplejo en cuanto a cuál puede ser la causa. Creo que mi código es bastante indulgente con respecto a la precisión, pero como estoy al otro lado del estanque, ¿podría estar muy lejos?

¿Alguien puede mostrar errores evidentes en mi código? (He eliminado algunos métodos no relacionados).

static NSTimeInterval MaxLocationAge = 60.0; // Seconds. static CLLocationAccuracy DesiredHorizontalAccuracy = 200.0; // Meters. static NSTimeInterval UpdateTimeout = 30.0; // Seconds. @implementation AFLocation @synthesize locationManager = _locationManager, delegate = _delegate, bestEffortAtLocation = _bestEffortAtLocation, updateStartedAt = _updateStartedAt; - (id)init { self = [super init]; if (self) { CLLocationManager *manager = [[CLLocationManager alloc] init]; self.locationManager = manager; [manager release]; self.locationManager.delegate = self; self.locationManager.distanceFilter = kCLDistanceFilterNone; self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; } return self; } - (void)update { self.updateStartedAt = [NSDate date]; isUpdating = YES; [self.locationManager startUpdatingLocation]; } - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { if ([[NSDate date] timeIntervalSinceDate:self.updateStartedAt] > UpdateTimeout) { [self.locationManager stopUpdatingLocation]; if (isUpdating) { [self updateDidTimeout]; } isUpdating = NO; } NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; if (locationAge > MaxLocationAge) { return; } if (newLocation.horizontalAccuracy < 0) { return; } if (self.bestEffortAtLocation == nil || self.bestEffortAtLocation.horizontalAccuracy > newLocation.horizontalAccuracy) { self.bestEffortAtLocation = newLocation; if (newLocation.horizontalAccuracy <= DesiredHorizontalAccuracy) { self.bestEffortAtLocation = nil; isUpdating = NO; [self.locationManager stopUpdatingLocation]; [self didUpdateWithDesiredAccuracyToLocation:newLocation]; } } } @end


Ha configurado el CLLocationManager para utilizar la precisión deseada de kCLLocationAccuracyBestForNavigation , pero está comparando la precisión de la ubicación con una precisión arbitraria de 200 metros. Con kCLLocationAccuracyBestForNavigation es un tipo opaco, ¿cómo sabe que el gerente incluso está luchando por su precisión de 200 metros? Cuando recibo actualizaciones de ubicación, verifico si la precisión es menor o igual a la precisión deseada establecida en mi administrador de ubicación.


WiFi y 3G solo se utilizan para acelerar el proceso de obtener una ubicación de alta precisión (<300 m). Sin conectividad a Internet, puede tomar de 3 a 10 minutos obtener una solución usando solo GPS. (Se utilizan para arreglos de baja precisión con torre celular o triangulación wifi y también para descargar los datos de efemérides satelitales para acelerar la adquisición de señal GPS).

La solución inicial con Wi-Fi o 3G podría ser de alrededor de 800m de precisión, pero si el dispositivo tiene conectividad 3G (o WiFi o Edge) y puede obtener señales suficientemente fuertes de los satélites GPS, debería poder obtener una posición GPS dentro de los 20 -90 segundos.

Tal vez su aplicación no está esperando lo suficiente, o el usuario tiene una señal de GPS débil, o tiene un dispositivo sin GPS (es decir: iPhone1 o iPod Touch o iPads que no son 3G). En ese caso, no obtendrán la precisión requerida de 200m.