CMPedometer 实现计步

CMPedometer:统计某段时间内用户步数,距离信息,甚至计算用户爬了多少级楼梯 在iOS8.0及以后系统可以使用(8.0以前用CMSetpCounter)

要使用CMPedometeri 需要我们在对应类中导入CoreMotion 并声明属性

#import <CoreMotion/CoreMotion.h>

@property (nonatomic, strong) CMPedometer * pedonmeter;

 

在ViewDidLoad中初始化

self.pedonmeter = [[CMPedometer alloc]init];

 

 

判断计步方法是否可用

if (!([CMPedometer isStepCountingAvailable] || [CMMotionActivityManager isActivityAvailable])) {

        

        NSString *msg = @"抱歉,不能运行哦,只支持iOS 8.0以上及iPhone5s以上机型.";

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No!"

                                                        message:msg

                                                       delegate:nil

                                              cancelButtonTitle:@"OK"

                                              otherButtonTitles:nil];

        [alert show];

        

    }else{

        

       // do counter

    }

 

 

// 获取前7天的数据

- (void)getStepOneWeek

{

    __weak ViewController * weakSelf = self;  // 弱引用 防止内存泄漏

    

    if ([CMPedometer isStepCountingAvailable]) { // 判断能否计步

        NSMutableString * dateStr = [NSMutableString string]; //可变数组记录每天步数

        

        for (int i = 6; i >= 0; i --) {   // for循环 取出每天的步数

            

        NSCalendar *calendar = [NSCalendar currentCalendar];

            NSDate *now = [NSDate date];

        NSLog(@"234567890----%@", now);

        NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:now];

            

            NSDate *nowDate = [calendar dateFromComponents:components];

            NSDate * startTempDate = [calendar dateByAddingUnit:NSCalendarUnitDay value:-i toDate:nowDate options:0];

            // 结束日期

            NSDate *endTempDate = [calendar dateByAddingUnit:NSCalendarUnitDay value:1 toDate:startTempDate options:0];

            NSDate * startDate = [self getStartTimeWithDate:startTempDate];  // 将日期转为某年某月某天00:00:00

            NSDate * endDate = [self getStartTimeWithDate:endTempDate];

            NSLog(@"%@  %@ ", startDate, endDate);

      // 从开始时间到结束时间的总步数

            [self.pedometer queryPedometerDataFromDate:startDate toDate:endDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {

                dispatch_async(dispatch_get_main_queue(), ^{

                    if (error) {

                        NSLog(@"%@", error); // 出错  错误信息  如果是Error Domain=CMErrorDomain Code=103 "The operation couldn’t be completed. (CMErrorDomain error 103.)  去看pedometer是不是成员变量 并在viewDidiLoad:中创建实例

                        UIAlertView *error = [[UIAlertView alloc] initWithTitle:@"No!" message:@"error" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];

                        [error show];

                    }

                    else {

                        

                        [dateStr appendFormat:@"%@+%.2f " ,pedometerData.numberOfSteps,[pedometerData.distance doubleValue]];

                        NSLog(@"%@", dateStr);

                        if (i == 0) {

                            weakSelf.totalLabel.text = [NSString stringWithFormat:@"%@",dateStr];

                        }

                    }

                });

            }];

            

        }

    }

}

 

步数收集到了!

然后就是实时步数记录

 

 

// 今天的实时数据

- (void)getTodayData

{

    __weak ViewController * weakSelf = self;

    

    if ([CMPedometer isStepCountingAvailable]) {

 

        NSDate * date = [self getStartTime];  // 获取今天的00:00:00

        NSLog(@"formDate:%@",date);

 

    // 从data开始的实时步数记录

        [self.pedometer startPedometerUpdatesFromDate:date withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {

            NSLog(@"距离%@+步数%@",pedometerData.distance, pedometerData.numberOfSteps);

            if (error) {

                NSLog(@"%@",error);

            }else{

                dispatch_async(dispatch_get_main_queue(), ^{

          // distance 走的距离   numberOfSteps  步数

                    NSString * str = [NSString stringWithFormat:@"%.2f+%@",[pedometerData.distance doubleValue], pedometerData.numberOfSteps];

                    weakSelf.distanceLabel.text = str;

                });

            }

        }];

        

    }

}

 

OK 实时记录和往日查询都Ok了!!  

 

Error Domain=CMErrorDomain Code=105  该错误是因为没有设置infoplist文件中的Motion隐私选项 或者是未在设置->隐私->运动与健康 中打开权限。

                      另一个错误code码是104(或者103?)  是因为 pedometer 不是property属性(全局属性) 。

 

 上面因为取时间转化问题 可能会有步数差距。 需要根据自己的需要将时间调整好。

 

 

 

原文地址:https://www.cnblogs.com/LoveStoryJX/p/6605849.html