iOS CoreLocation не работает через 3G только в США - PullRequest
4 голосов
/ 07 декабря 2011

Мое приложение не может определить координаты широты / долготы по 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 ]

1 голос
/ 08 декабря 2011

WiFi и 3G используются только для ускорения процесса получения местоположения с высокой точностью (<300 м).Без подключения к Интернету исправление с использованием только GPS может занять 3-10 <em>минут .(Они используются для исправлений низкой точности с триангуляцией сотовой вышки или Wi-Fi, а также для загрузки эфемеридных данных спутника для ускорения получения сигнала GPS.), но если устройство имеет возможность подключения 3G (или WiFi или Edge) и может получать достаточно сильные сигналы от спутников GPS, оно должно иметь возможность определить местоположение GPS в течение 20-90 секунд.

Возможно, ваше приложение не ждет достаточно долго, или у пользователя слабый сигнал GPS, или устройство без GPS (например, iPhone1 или iPod Touch или iPad не 3G).В этом случае они не получат достаточную точность 200 м.

0 голосов
/ 08 декабря 2011

Вы установили CLLocationManager для использования желаемой точности kCLLocationAccuracyBestForNavigation, но вы сравниваете точность местоположения с произвольной точностью 200 метров. С kCLLocationAccuracyBestForNavigation непрозрачным типом, откуда вы знаете, что менеджер даже стремится к вашей 200-метровой точности? Когда я получаю обновления местоположения, я проверяю, является ли точность меньше или равна желаемой точности, установленной в моем менеджере местоположений.

...