這里我是用CoreMotion的蘋果原生類來做的, 當然有些資料是用HealthKit,但是用HealthKit用戶授權(quán)的時候要跳轉(zhuǎn)到系統(tǒng)界面讓用戶選擇所要授權(quán)的數(shù)據(jù)類型.而用CoreMotion卻可以做到像調(diào)用系統(tǒng)相機那樣彈出一個框點擊是或者否來進行授權(quán).
```
#import "QYPedometerManager.h"
#import <CoreMotion/CoreMotion.h>
@interface QYPedometerManager ()
@property(nonatomic, strong) CMStepCounter *stepCounter;
@property(nonatomic, strong) CMPedometer *pedometer;
@property(nonatomic, strong) NSOperationQueue *operationQueue;
@end
@implementation QYPedometerManager
+ (QYPedometerManager *)shared {
static dispatch_once_t pred;
static QYPedometerManager *sharedInstance = nil;
dispatch_once(&pred, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (instancetype)init {
self = [super init];
if (self) {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0
if ([CMPedometer isStepCountingAvailable]) {
self.pedometer = [[CMPedometer alloc] init];
}
#else
if ([CMStepCounter isStepCountingAvailable]) {
self.stepCounter = [[CMStepCounter alloc] init];
self.operationQueue = [[NSOperationQueue alloc] init];
}
#endif
}
return self;
}
/**
*? 查詢某時間段的運動數(shù)據(jù)
*
*? @param start? 開始時間
*? @param end? ? 結(jié)束時間
*? @param handler 查詢結(jié)果
*/
- (void)queryPedometerDataFromDate:(NSDate *)start
toDate:(NSDate *)end
withHandler:(QYPedometerHandler)handler {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0
[_pedometer
queryPedometerDataFromDate:start
toDate:end
withHandler:^(CMPedometerData *_Nullable pedometerData,
NSError *_Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
QYPedometerData *customPedometerData =
[[QYPedometerData alloc] init];
customPedometerData.numberOfSteps =
pedometerData.numberOfSteps;
customPedometerData.distance = pedometerData.distance;
customPedometerData.floorsAscended =
pedometerData.floorsAscended;
customPedometerData.floorsDescended =
pedometerData.floorsDescended;
handler(customPedometerData, error);
});
}];
#else
[_stepCounter queryStepCountStartingFrom:start
to:end
toQueue:_operationQueue
withHandler:^(NSInteger numberOfSteps,
NSError *__nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
QYPedometerData *pedometerData =
[[QYPedometerData alloc] init];
pedometerData.numberOfSteps =
@(numberOfSteps);
handler(pedometerData, error);
});
}];
#endif
}
/**
*? 監(jiān)聽今天(從零點開始)的行走數(shù)據(jù)
*
*? @param handler 查詢結(jié)果夏伊、變化就更新
*/
- (void)startPedometerUpdatesTodayWithHandler:(QYPedometerHandler)handler;
{
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0
NSDate *toDate = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSDate *fromDate =
[dateFormatter dateFromString:[dateFormatter stringFromDate:toDate]];
[_pedometer
startPedometerUpdatesFromDate:fromDate
withHandler:^(CMPedometerData *_Nullable pedometerData,
NSError *_Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
QYPedometerData *customPedometerData =
[[QYPedometerData alloc] init];
customPedometerData.numberOfSteps =
pedometerData.numberOfSteps;
customPedometerData.distance =
pedometerData.distance;
customPedometerData.floorsAscended =
pedometerData.floorsAscended;
customPedometerData.floorsDescended =
pedometerData.floorsDescended;
handler(customPedometerData, error);
});
}];
#else
[_stepCounter startStepCountingUpdatesToQueue:_operationQueue
updateOn:10
withHandler:^(NSInteger numberOfSteps,
NSDate *_Nonnull timestamp,
NSError *_Nullable error) {
QYPedometerData *pedometerData =
[[QYPedometerData alloc] init];
pedometerData.numberOfSteps =
@(numberOfSteps);
handler(pedometerData, error);
}];
#endif
}
/**
*? 停止監(jiān)聽運動數(shù)據(jù)
*/
- (void)stopPedometerUpdates {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0
[_pedometer stopPedometerUpdates];
#else
[_stepCounter stopStepCountingUpdates];
#endif
}
/**
*? 計步器是否可以使用
*
*? @return YES or NO
*/
+ (BOOL)isStepCountingAvailable {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0
return [CMPedometer isStepCountingAvailable];
#else
return [CMStepCounter isStepCountingAvailable];
#endif
}
@end
```
頭文件
```
/** *? 計步器管理類 */
#import "QYPedometerData.h"
#import <UIKit/UIKit.h>
typedef void (^QYPedometerHandler)(QYPedometerData *pedometerData,
NSError *error);
@interface QYPedometerManager : NSObject
+ (QYPedometerManager *)shared;
/**
*? 計步器是否可以使用
*
*? @return YES or NO
*/
+ (BOOL)isStepCountingAvailable;
/**
*? 查詢某時間段的行走數(shù)據(jù)
*
*? @param start? 開始時間
*? @param end? ? 結(jié)束時間
*? @param handler 查詢結(jié)果
*/
- (void)queryPedometerDataFromDate:(NSDate *)start
toDate:(NSDate *)end
withHandler:(QYPedometerHandler)handler;
/**
*? 監(jiān)聽今天(從零點開始)的行走數(shù)據(jù)
*
*? @param handler 查詢結(jié)果律胀、變化就更新
*/
- (void)startPedometerUpdatesTodayWithHandler:(QYPedometerHandler)handler;
/**
*? 停止監(jiān)聽運動數(shù)據(jù)
*/
- (void)stopPedometerUpdates;
```
通過創(chuàng)建該類調(diào)用該類方法就能獲取到每天走的步數(shù)和距離了,當然還能獲取到其他數(shù)據(jù)如樓層