iOS CoreLocation海拔高度

在iOS 4.0之前, CoreLocation正确报告高度,现在总是报告为0英尺。

 -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation*)newLocation fromLocation:(CLLocation *)oldLocation { NSString *tLatitude = [NSString stringWithFormat:@"%3.5f", newLocation.coordinate.latitude]; NSString *tLongitude = [NSString stringWithFormat:@"%3.5f", newLocation.coordinate.longitude]; /* the following returns 0 */ NSString *tAltitude = [NSString stringWithFormat:@"%i", newLocation.altitude]; /* theres more code, but it's not relevant, and this worked prior to iOS 4.0*/ [manager stopUpdatingLocation]; } 

不在设备和模拟器上工作,是否有其他人遇到这个问题?

如果您使用startMonitoringSignificantLocationChanges ,这是iOS 4.0的新function,那么您将无法获得高度更新。 这种低功耗模式只使用蜂窝塔来计算用户的位置,而这种方法不报告高度。

更一般地说,iPhone有三种方法来确定你的位置 – 手机信号塔,Wi-Fi和GPS。 GPS使用时只能获得高度。 因此,即使您将您desiredAccuracy准确desiredAccuracy设置为非常精确以迫使设备使用GPS,但如果用户在室内,iPhone可能无法获得GPS信号,并将回退到蜂窝或Wi-Fi。 在这种情况下,你不会得到一个高度。 另外,考虑使用iPod Touch的用户 – 只能通过Wi-Fi获取位置,因此也不会报告高度。

从核心位置数据types参考 :

CLLocationDistance数据types(海拔高度的数据types)是double CLLocationDistance数据types。 您使用的stringWithFormat格式化程序是一个integer 。 您需要先将高度投射到一个integer ,或者使用一个double (%f)格式器。

两件事你可以尝试。 首先,尝试将位置pipe理器所需的desiredAccuracykCLLocationAccuracyBest

如果这不起作用,请尝试删除[manager stopUpdatingLocation]; ,并把NSLog放在高度的didUpdateToLocation 。 有时需要在显示高度之前缩小一点。

核心位置并不总是立即报告高度。 我通常在“成功”委托方法中检查零高度。 如果高度还是0,我会继续检查,否则,我把CoreLocation打开。