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属性(全局属性) 。
上面因为取时间转化问题 可能会有步数差距。 需要根据自己的需要将时间调整好。