• 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属性(全局属性) 。

     

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

     

     

     

  • 相关阅读:
    Docker 使用笔记 (一)
    oracle 截取字符(substr),检索字符位置(instr)
    oracle表空间配额(quota)与UNLIMITED TABLESPACE系统权限
    把大象放到eclipse分几步?
    hadoop -- 搭建集群小工具
    1. Mybatis简单操作
    SpringMVC --- 拦截器 HandlerInterceptor
    Spring MVC --- 异步请求
    Spring MVC--RequestMapping
    Spring MVC 异常控制
  • 原文地址:https://www.cnblogs.com/LoveStoryJX/p/6605849.html
Copyright © 2020-2023  润新知