iOS 实现计步器功能

作者: zyh1158 | 来源:发表于2016-05-25 15:56 被阅读2806次

    现在越来越多的人关注运动和健康,iOS系统也在很早的时候就自带了健康APP,下面详细描述一下在我们开发中,怎么实现计步器功能。
    首先我们先了解一下我们需要的系统框架:Core Motion

    Core Motion框架支持了一些预置的motion动作,比如步数、爬楼还有移动类型(行走、骑行等等)

    我们利用Core Motion框架就可以直接从设备读取我们需要的数据了,由于想获取motion动作是和iOS系统版本和使用的设备处理器有关系,所以QQ健康只支持iOS8及其以上系统的,在这里我也只说明iOS8及其以上系统的实现。

    CMPedometer


    在iOS8及其以上系统中我们可以使用CMPedometer类获取行走相关信息(步数、距离、上楼、下楼、当前速度等)。

    当前设备是否可以获取步数
    + (BOOL)isStepCountingAvailable;

    当前设备是否可以获取距离
    + (BOOL)isDistanceAvailable;

    当前设备是否可以获取上下楼层数
    + (BOOL)isFloorCountingAvailable;

    当前设备是否可以获取速度(s/m)
    + (BOOL)isPaceAvailable

    当前设备是否可以获取节奏
    + (BOOL)isCadenceAvailable

    根据开始和结束时间查询行走相关信息
    - (void)queryPedometerDataFromDate:(NSDate *)start toDate:(NSDate *)end withHandler:(CMPedometerHandler)handler;

    从某一时刻开始监测步数变化
    - (void)startPedometerUpdatesFromDate:(NSDate *)start withHandler:(CMPedometerHandler)handler;

    停止监测步数变化
    - (void)stopPedometerUpdates;

    了解完API后,我们看一下具体的使用:在View上创建两个lable,一个用来显示今日行走的步数

    UILabel *textLable = [[UILabel alloc]initWithFrame:CGRectMake(50, 140, 200, 44)];
    textLable.backgroundColor = [UIColor lightGrayColor];
    [textLable setText:@"今日行走的步数"];
    [self.view addSubview:textLable];
    _stepsLable = [[UILabel alloc]initWithFrame:CGRectMake(50, 200, 100, 44)];
    _stepsLable.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:_stepsLable];
    

    我们需要把获取的步数存入内存中,使用NSUserDefaults单例来储存,如果单例中没有储存相应的数据我们让lable的显示为零。

    //先判断设备是否支持计步功能
    if ([CMPedometer isStepCountingAvailable]) {
            
            self.stepCounter = [[CMPedometer alloc]init];
            
            NSDate *toDate = [NSDate date];
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"yyyy-MM-dd"];
            NSDate *fromDate =
            [dateFormatter dateFromString:[dateFormatter stringFromDate:toDate]];
            
            [self.stepCounter startPedometerUpdatesFromDate:fromDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
                
                NSLog(@"numberOfSteps%@",pedometerData.numberOfSteps);
                [[NSUserDefaults standardUserDefaults]setObject:pedometerData.numberOfSteps forKey:@"pedometerSteps"];
               
               if(!pedometerData.numberOfSteps) {
    
                    _stepsLable.text = @"0";
                }else
                {
                    _stepsLable.text = [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"pedometerSteps"]];
                }
                
            }];
        }
    

    相关文章

      网友评论

      • 木_穆:请问报这个错Error Domain=CMErrorDomain Code=107 "(null)"
        是什么原因?怎么解决?百度、谷歌都找过了😅
        48c6ed7446a4:你是不是没声明CMPedometer
      • 崠崠:这么简单?

      本文标题:iOS 实现计步器功能

      本文链接:https://www.haomeiwen.com/subject/ledtdttx.html