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-метровой точности? Когда я получаю обновления местоположения, я проверяю, является ли точность меньше или равна желаемой точности, установленной в моем менеджере местоположения.

Другие вопросы по тегам