現在越來越多的人關注運動和健康,iOS系統也在很早的時候就自帶了健康APP,下面詳細描述一下在我們開發中,怎麼實現計步器功能。
首先我們先了解一下我們需要的系統框架:Core Motion
DEMO: https://github.com/joelai/StepCounter
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"]];
}
}];
}