从iPhone 6中的气压计收集相对高度

时间:2014-09-20 17:27:39

标签: ios objective-c ios8 core-motion iphone-6

我正在尝试使用新款iPhone中的气压计传感器来显示设备的垂直速度。我最终在我的"动作"中得到了以下代码。模型,它执行以提供更多或更少的适当值。

然而,在执行startRelativeAltitudeUpdatesToQueue时,我在更新我的视图方面遇到了问题。 userRelativeAltitude的值已更新,但该函数从不返回任何内容(可能是因为它正在执行startRelativeAltitudeUpdatesTo Queue像循环一样工作。?)。我担心整个声明已经结束,而不是我的头脑。

我打算让功能更像是例如startAccelerometerUpdates。有没有更好的方法从晴雨表收集数据?

另外,如何检查设备是否有可用的气压计传感器?

    - (float) pullRelativeAltitude {

self._altitudeManager = [[CMAltimeter alloc] init];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[self._altitudeManager startRelativeAltitudeUpdatesToQueue:queue withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^ {

        _userRelativeAltitude = altitudeData.relativeAltitude.floatValue;
        NSLog(@"%f", altitudeData.relativeAltitude.floatValue);

    });
}];

NSLog(@"This is relative altitude: %f", _userRelativeAltitude is );

return _userRelativeAltitude;

}

建议真的很感激!

3 个答案:

答案 0 :(得分:1)

在Swift中,以下代码将检查高度是否可用:

if CMAltimeter.isRelativeAltitudeAvailable() {
  // your code
}
但是,我无法获得任何晴雨表读数。

答案 1 :(得分:1)

不确定你是否弄明白,但这对我有用 添加一件事,你可能已经想到了这一点,你不能在模拟器中。您需要iPhone 6或6+,并且应用必须在手机上运行:)

- (void)viewDidLoad {
    [super viewDidLoad];

    BOOL isReady = [CMAltimeter isRelativeAltitudeAvailable];
    if( isReady ) {
        NSLog(@"yes");
    } else {
        NSLog(@"no");
    }
    alt = [[CMAltimeter alloc] init];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [alt startRelativeAltitudeUpdatesToQueue:queue withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^ {
            NSLog(@"%f", altitudeData.relativeAltitude.floatValue);

        });
    }];
}

答案 2 :(得分:1)

我得到了它的工作,但是我必须在View Controller(而不是模型)中实现代码,以便用新的读取来更新UI。对于其他感兴趣的人,我的最终编码最终看起来像这样:

if ([CMAltimeter isRelativeAltitudeAvailable]) {
    self._altitudeManager = [[CMAltimeter alloc] init];

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [self._altitudeManager startRelativeAltitudeUpdatesToQueue:queue withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^ {

            //provide relative altitude
            float relativeAltitude;
            relativeAltitude = altitudeData.relativeAltitude.floatValue;
            self.userRelativeAltitude.text = [NSString stringWithFormat:@"%.0f m", relativeAltitude];

        });
    }];

} else {
    NSLog(@"barometer not available");
    _userVario.text = @"no barometer available";
}

感谢您的回答!