iOS 實現計步器功能

現在越來越多的人關注運動和健康,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"]];
            }

        }];
    }

發佈了40 篇原創文章 · 獲贊 11 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章