iOS CoreLocation не работает через 3G только в США
Мое приложение не может определить координаты широты / долготы по 3G в Северной Америке. Он отлично работает при подключении к Wi-Fi. Это было подтверждено как для AT&T, так и для Verizon с iOS 5. В Великобритании это работает, как ожидается, как для 3G, так и для Wi-Fi с o2.
Я действительно озадачен тем, что может быть причиной. Я думаю, что мой код довольно прост в отношении точности, но, поскольку я нахожусь на другой стороне пруда, я мог бы быть далеко?
Может кто-нибудь заметить какие-либо вопиющие ошибки в моем коде? (Я удалил несколько несвязанных методов).
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
2 ответа
Wi-Fi и 3G используются только для ускорения процесса получения местоположения с высокой точностью (<300 м). Без подключения к Интернету это может занять 3-10 минут, чтобы получить исправление, используя только GPS. (Они используются для исправлений низкой точности с триангуляцией сотовой вышки или Wi-Fi, а также для загрузки эфемерид спутниковых данных для ускорения получения сигнала GPS).
Первоначальное исправление с Wi-Fi или 3G могло бы быть с точностью около 800 м, что ожидается, но если устройство имеет подключение 3G (или Wi-Fi или Edge) и может получать достаточно сильные сигналы от спутников GPS, оно должно быть в состоянии получить позицию GPS в пределах 20-90 секунд
Возможно, ваше приложение не ждет достаточно долго, или у пользователя слабый сигнал GPS, или устройство без GPS (например, iPhone1 или iPod Touch или iPad не 3G). В этом случае они не получат достаточную точность 200 м.
Вы установили CLLocationManager
использовать желаемую точность kCLLocationAccuracyBestForNavigation
, но вы сравниваете точность местоположения с произвольной точностью 200 метров. С kCLLocationAccuracyBestForNavigation
как непрозрачный тип, откуда вы знаете, что менеджер даже стремится к вашей 200-метровой точности? Когда я получаю обновления местоположения, я проверяю, является ли точность меньше или равна желаемой точности, установленной в моем менеджере местоположения.