iOS CoreLocation在美国仅限3G网络无法使用

4
我的应用程序无法在北美的3G网络中确定经纬度坐标。当连接到Wi-Fi时,它可以完美地工作。这已经在使用iOS 5的AT&T和Verizon上得到了确认。在英国,o2的3G和Wi-Fi上都能正常工作。
我真的很困惑可能是什么原因。我认为我的代码对于精度相当宽容,但由于我在大西洋彼岸,我可能完全错了?
有人能指出我的代码中是否存在任何明显的错误吗?(我已经删除了一些不相关的方法。)
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

我刚刚让一个美国人在应用商店试用了一个名为GPS状态的应用程序。最初的水平精度超过了800米,但实际坐标相当准确。这在美国正常吗?大多数人将水平精度限制在什么值? - ileitch
我位于美国,尝试了GPS状态,并在WI-FI和3G上获得了72m的精度。 - Kseniya
2个回答

1

无线网络和3G仅用于加速获取高精度(<300m)定位过程。如果没有互联网连接,仅使用GPS可能需要3-10分钟才能获得修正值。(它们用于通过基站或WiFi三角测量获得低精度修正,并下载卫星星历数据以加速GPS信号获取)。

使用WiFi或3G进行的初始修正可以达到大约800米的精度,这是可以预期的,但是如果设备拥有3G(或WiFi或Edge)连接并且可以从GPS卫星中获得足够强的信号,则应该能够在20-90秒内获得GPS位置。

也许您的应用程序等待时间不够长,或者用户的GPS信号较弱,或者使用没有GPS的设备(例如:iPhone1或iPod Touch或非3G iPad)。在这种情况下,他们将无法获得所需的200米精度。


0
你已经将CLLocationManager设置为使用kCLLocationAccuracyBestForNavigation的期望精度,但是你正在将位置的精度与200米的任意精度进行比较。由于kCLLocationAccuracyBestForNavigation是一个不透明类型,你怎么知道管理器是否正在努力实现你的200米精度?当我接收到位置更新时,我会检查精度是否小于或等于我的位置管理器上设置的期望精度。

从阅读其他资源来看,kCLLocationAccuracyBestForNavigation似乎是更高精度的最佳选择。为什么不使用这个设置来争取最佳准确性呢?您在应用程序中设置了期望的准确度吗? - ileitch
我的观点是,你不知道那个选项的精确度是多少米,因此将其与随机指标进行比较可能永远无法提供新位置符合该标准的情况。 - Mark Adams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接