IOS 计步器,ios计步器

这篇博客介绍的是当前比较流行的“计步器”-只是简单的知识点

计步器的实现在IOS8开始进行了改变。

但是我会对之前之后的都进行简单介绍。

IOS 8 –

//
//  ViewController.m
//  CX 计步器
//
//  Created by ma c on 16/4/12.
//  Copyright © 2016年 bjsxt. All rights reserved.
//

#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>

@interface ViewController ()

@property (nonatomic, strong) CMStepCounter * counter;

@end

@implementation ViewController

#pragma mark - <懒加载>
- (CMStepCounter *)counter{
    if (!_counter) {
        _counter = [[CMStepCounter alloc]init];
    }
    return _counter;
}


- (void)viewDidLoad {
    [super viewDidLoad];

    //判断计步器是否可用
    if (![CMStepCounter isStepCountingAvailable]) {
        NSLog(@"计步器不可用");
        return;
    }
    //开始计步
    //startStepCountingUpdatesToQueue 选择在哪个线程里进行
    //updateOn 对应的是每隔几秒后回调下面的block
    [self.counter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:2 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {

        if (error) {
            return ;
        }

        NSLog(@"可以在这里进行一些操作");

    }];
}


@end

IOS 8 +

//
//  ViewController.m
//  CX 计步器
//
//  Created by ma c on 16/4/12.
//  Copyright © 2016年 bjsxt. All rights reserved.
//

#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>

@interface ViewController ()

@property (nonatomic, strong) CMPedometer * meter;

@end

@implementation ViewController

#pragma mark - <懒加载>
- (CMPedometer *)meter{
    if (!_meter) {
        _meter = [[CMPedometer alloc]init];
    }
    return _meter;
}


- (void)viewDidLoad {
    [super viewDidLoad];

    //判断计步器是否可用
    if (![CMPedometer isStepCountingAvailable]) {
        NSLog(@"计步器不可用");
        return;
    }
    //开始计步
    //在一段时间内的部步数与距离
    [self.meter queryPedometerDataFromDate:[NSDate date] toDate:[NSDate dateWithTimeIntervalSinceNow:60*60] withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
        if (error)
        {
            NSLog(@"error===%@",error);
        }
        else {
            NSLog(@"步数===%@",pedometerData.numberOfSteps);
            NSLog(@"距离===%@",pedometerData.distance);
        }
    }];
}


@end

 

计步器,ios计步器
这篇博客介绍的是当前比较流行的计步器-只是简单的知识点
计步器的实现在IOS8开始进行了改变。 但是我会对之前之…

//
//  ViewController.m
//  CX 计步器
//
//  Created by ma c on 16/4/12.
//  Copyright © 2016年 bjsxt. All rights reserved.
//

#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>

@interface ViewController ()

@property (nonatomic, strong) CMStepCounter * counter;

@end

@implementation ViewController

#pragma mark - <懒加载>
- (CMStepCounter *)counter{
    if (!_counter) {
        _counter = [[CMStepCounter alloc]init];
    }
    return _counter;
}


- (void)viewDidLoad {
    [super viewDidLoad];

    //判断计步器是否可用
    if (![CMStepCounter isStepCountingAvailable]) {
        NSLog(@"计步器不可用");
        return;
    }
    //开始计步
    //startStepCountingUpdatesToQueue 选择在哪个线程里进行
    //updateOn 对应的是每隔几秒后回调下面的block
    [self.counter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:2 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {

        if (error) {
            return ;
        }

        NSLog(@"可以在这里进行一些操作");

    }];
}


@end

IOS 8 +

一. 简介

iOS设备内置了一些传感器,并提供了相关的API供调用,关于iOS传感器的类型及作用等相关知识,可以查看文章iOS开发之传感器
,本篇文章的demo的github地址是:传感器的使用),感兴趣的可以瞄瞄。

传感器 涉及的类 作用
光线传感器(Ambient Light ) UIScreen、AVCaptureSession 自动调节屏幕亮度、手电筒的开启(mobile有)
距离传感器(Proximity) UIDevice 打电话自动锁屏
计步器(Pedometer) CMPedometer 运动数据测量
加速计(Accelerometer) CMMotionManager 计步器、摇一摇
陀螺仪(Gyroscope) CMMotionManager 游戏控制
磁力计(Magnetometer) CMMotionManager 磁力感应
湿度传感器(Moisture) 维修时检测设备进水与否
内部温度传感器(Internal Temperature)

图片 1

SensorDemo

只有通过计步器状态+计步器特性 才能更准确的自动标记用户车辆停车位置!

现实和理想还是有很大差距的!

这篇博客介绍的是当前比较流行的“计步器”-只是简单的知识点

计步器的实现在IOS8开始进行了改变。

四. 加速计/陀螺仪/磁力计

  1. 加速计/陀螺仪/磁力计这三种感应器使用也很简单,直接通过CMMotionManager对象处理,获取数据的方法大同小异;
  1. CMMotionManager对象可以检测设备的可用性、获取数据、设置数据的更新频率,有需要的可以直接去头文件看看
  2. 通过计步器制作摇一摇、计步器:按我理解呢,如果考虑周全,摇一摇、记步也需要比较复杂的算法,自己做难免不全面;并且这些苹果已经有对应API,直接调用就好
  3. CMMotion的使用可以参考这篇文章详说CMDeviceMotion

由于这三种感应器获取数据方式一致,就只对加速计进行举例说明

  1. 成员变量及方法

     // 存储加速计数据
    @property(readonly, nullable) CMAccelerometerData *accelerometerData;
    
    // 开始更新加速计数据,不带回调,可以添加定时器定时去获取CMMotionManager对象的accelerometerData数据
    - (void)startAccelerometerUpdates;
    
    // 开始更新加速计数据,带回调,由于数据可能更新频率快,不建议使用主队列
    - (void)startAccelerometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMAccelerometerHandler)handler;
    
    // 不再需要更新数据的时候需要调用停止更新的方法
    - (void)stopAccelerometerUpdates;
    
  2. 使用步骤
    // 1. 初始化CMMotionManager对象并设置属性存储,设置数据的更新间隔

    • (CMMotionManager *)motionManage {
      if (!_motionManage) {
      _motionManage = [[CMMotionManager alloc] init];
      // 控制传感器的更新间隔
      _motionManage.accelerometerUpdateInterval = 0.2;
      _motionManage.gyroUpdateInterval = 0.2;
      _motionManage.magnetometerUpdateInterval = 0.2;
      }
      return _motionManage;
      }

      // 2. 开始/结束更新数据,只举例带回调的方法

      • (IBAction)accelerometerTest:(UIButton *)sender {
        BOOL start = !sender.selected;

        // 2.1 根据设置的时间间隔定期更新数据
        if (start) {

          // 可用性检测
          if(![self.motionManage isAccelerometerAvailable]){
              [self showWithTitle:@"加速计不可用" message:nil];
              return;
          }
          sender.selected = YES;
          __weak typeof (self) weakSelf = self;
        
          // 数据更新有可能比较频繁,不建议使用主队列
          NSOperationQueue *queue = [NSOperationQueue new];
          [self.motionManage startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
              // 回到主线程
              dispatch_async(dispatch_get_main_queue(), ^{
                  // 数据显示
                  weakSelf.accelerationXLbl.text = [NSString stringWithFormat:@"%.2f", accelerometerData.acceleration.x];
                  weakSelf.accelerationYLbl.text = [NSString stringWithFormat:@"%.2f", accelerometerData.acceleration.y];
                  weakSelf.accelerationZLbl.text = [NSString stringWithFormat:@"%.2f", accelerometerData.acceleration.z];
              });
          }];
        

        } else {

        // 2.2 停止获取数据

          sender.selected = NO;
          [self.motionManage stopAccelerometerUpdates];
        

        }
        }

  3. 自带摇一摇功能
    UIResponder类中已经封装好了摇一摇功能,当对象成为第一响应者之后,
    系统就会通知对象摇一摇的开始/结束状态,实现以下方法就可以

    - (void)motionBegan:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event;
    - (void)motionEnded:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event;
    - (void)motionCancelled:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event;
    

-> 现实测试计步器:

相关文章