我正在尝试在Xcode和Simulator上开发一个高度计,但它总是在海面以上的高度返回0。 我不明白为什么,我在模拟器上尝试了很多地方。
我的代码是:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
_mapView.delegate = self;
_locationManager = [[CLLocationManager alloc] init];
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
_locationManager.pausesLocationUpdatesAutomatically = YES;
_locationManager.delegate = self;
firstLocation = YES;
checkUserLocation = NO;
}
- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
CLLocation *location = [locations lastObject];
lastLocation = location.coordinate;
_latitudeLabel.text = [NSString stringWithFormat:@"Current latitude: %f", location.coordinate.latitude];
_longitudeLabel.text = [NSString stringWithFormat:@"Current longitude: %f", location.coordinate.longitude];
_altitudeLabel.text = [NSString stringWithFormat:@"Current altitude: %f m", location.altitude];
}
我的错误在哪里?
答案 0 :(得分:3)
您的代码没有任何问题,因为您使用的是模拟器。
确定海拔高度需要具有GPS功能的设备,并且您还需要在该设备上使用GPS才能获得它(即使在支持GPS的设备上,仅限wifi的位置也无法正确报告海拔高度)。 iOS模拟器没有这些功能,因此高度不准确。您需要使用带有GPS的真实设备来获取高度测量结果。
如果你想模拟一个高度的CLLocation你可以创建你的CLLocation对象并自己传递一个高度:
- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate
altitude:(CLLocationDistance)altitude
horizontalAccuracy:(CLLocationAccuracy)hAccuracy
verticalAccuracy:(CLLocationAccuracy)vAccuracy
timestamp:(NSDate *)timestamp
Altitude是一个只读属性,因此您需要自己创建一个新的CLLocation对象,而不是在委托回调中收到CLLocation对象时手动更改它。