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

WiFi和3G仅用于加快获得高精度(<300m)位置的过程。如果没有互联网连接,可能需要3-10 分钟才能使用GPS进行修复。(它们用于与蜂窝塔或wifi三角测量的低精度修复,也用于下载卫星星历数据以加快GPS信号采集)。

使用WiFi或3G的初始修复可能在800米左右的精度,但如果设备有3G(或WiFi或Edge)连接,并且可以从GPS卫星获得足够强的信号,它应该能够在20-90秒内获得GPS位置。

也许你的应用程序等待的时间不够长,或者用户的GPS信号较弱,或者用户的设备没有GPS(即:iPhone1或iPod Touch或非3g ipad)。在这种情况下,他们将无法达到所需的200米精度。

您已经将CLLocationManager设置为使用kCLLocationAccuracyBestForNavigation所需的精度,但是您正在将位置的精度与200米的任意精度进行比较。由于kCLLocationAccuracyBestForNavigation是不透明类型,您如何知道经理甚至在努力实现您的200米精度?当我收到位置更新时,我检查准确性是否小于或等于位置管理器上设置的所需精度。

最新更新