iOS中的各种传感器

作者: 打电话记错号码的人 | 来源:发表于2016-09-09 16:47 被阅读1202次

    作品链接:
    http://www.jianshu.com/users/1e0f5e6f73f6/top_articles

    1.距离传感器

    一.距离传感器的介绍

    • 距离传感器主要是检测是否有物品靠近
    • 默认情况下距离传感器是关闭状态,只需要打开即可

    二.距离传感器代码的实现

    • 打开距离传感器
    [UIDevice currentDevice].proximityMonitoringEnabled = YES;
    
    
    • 监听是有物品靠近还是离开
    // 监听有物品靠近还是离开
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange) name:UIDeviceProximityStateDidChangeNotification object:nil];
    
    - (void)proximityStateDidChange
    {
        if ([UIDevice currentDevice].proximityState) {
            NSLog(@"有物品靠近");
        } else {
            NSLog(@"有物品离开");
        }
    }
    

    2.加速计

    一.加速计的介绍

    • 加速计的作用:用于检测设备的运动(比如摇晃)
    • 加速计的经典应用场景
      • 摇一摇
      • 计步器
    • 加速计的原理
      • 检测设备在X、Y、Z轴上的加速度 (哪个方向有力的作用,哪个方向运动了)
      • 根据加速度数值,就可以判断出在各个方向上的作用力度

    二.获取加速计的值

    1.旧的API获取

    • 在iOS4以前:使用UIAccelerometer,用法非常简单(到了iOS5就已经过期)

    2.代码实现

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 1.获取 的对象
        UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
        
        // 2.设置代理 遵守代理协议UIAccelerometerDelegate
        accelerometer.delegate = self;
        
        // 3.设置采样间隔
        accelerometer.updateInterval = 0.2;
    }
    
    #pragma mark - UIAccelerometerDelegate方法
    - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
    {
        NSLog(@"x:%f-y:%f-z:%f",acceleration.x, acceleration.y, acceleration.z);
    }
    

    2.新的API获取

    • 从iOS4开始,苹果专门封装了一个和运动相关的框架:CoreMotion框架
    • 可以通过该框架来获取加速计的数值
    • 获取加速计也有两种方式
      • push方式:实时采集所有数据(采集频率高)

        • 创建运动管理者对象
        • 判断加速计是否可用
        • 设置采样间隔
        • 开始采集数据
      • pull方式:在有需要的时候,再主动去采集数据

      • 创建运动管理者对象

      • 判断加速计是否可用

      • 开始采样

      • 需要时通过运动管理者去获取数据

    代码实现

    1.导入第三方框架

    #import <CoreMotion/CoreMotion.h>
    

    2.创建运动管理者并懒加载

    
    /** 运动管理者对象 */
    @property (nonatomic, strong) CMMotionManager *manager;
    
    #pragma mark - 懒加载
    - (CMMotionManager *)manager
    {
        if (_manager == nil) {
            _manager = [[CMMotionManager alloc] init];
        }
        
        return _manager;
    }
    
    

    3.push方式的代码实现

    // 1.判断加速计是否可用
        if (!self.manager.isAccelerometerAvailable) {
            NSLog(@"加速计不可用,请跟换手机");
            return;
        }
        
        // 2.设置采样间隔
        self.manager.accelerometerUpdateInterval = 0.5;
        
        // 3.开始采集数据
        [self.manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@",error);
                return ;
            }
            
            CMAcceleration acceleration = accelerometerData.acceleration;
            NSLog(@"x:%f-y:%f-z:%f",acceleration.x, acceleration.y, acceleration.z);
        }];
    
    

    4.pull方式的代码实现

    // 1.判断加速计是否可用
        if (!self.manager.isAccelerometerAvailable) {
            NSLog(@"加速计不可用,请跟换手机");
            return;
        }
        
        // 2.开始采集数据
        [self.manager startAccelerometerUpdates];
        
        CMAcceleration acceleration = self.manager.accelerometerData.acceleration;
        NSLog(@"x:%f-y:%f-z:%f",acceleration.x, acceleration.y, acceleration.z);
    
    

    3.陀螺仪

    一.陀螺仪的介绍

    • 陀螺仪主要用于检测设备的旋转
    • 应用场景:游戏中

    二.陀螺仪信息的获取

    • 通过CoreMotion框架来获取

    • 两种方式来获取

      • push方式

        • 创建运动管理者
        • 判断陀螺仪是否可用
        • 设置采样间隔
        • 开始采样
      • pull方式

        • 创建运动管理
        • 判断陀螺仪是否可用
        • 开始采样
        • 在需要时通过运动管理获取数值
    代码实现

    1.导入第三方框架

    #import <CoreMotion/CoreMotion.h>
    

    2.创建运动管理者并懒加载

    /** 运动管理者对象 */
    @property (nonatomic, strong) CMMotionManager *manager;
    
    #pragma mark - 懒加载
    - (CMMotionManager *)manager
    {
        if (_manager == nil) {
            _manager = [[CMMotionManager alloc] init];
        }
        
        return _manager;
    }
    ```
    
    3.push方式的代码实现
    
    ```
    // 1.判断陀螺仪是否可以用
        if (!self.manager.isGyroAvailable) {
            NSLog(@"");
            return;
        }
        
        // 2.设置采样间隔
        self.manager.gyroUpdateInterval = 0.2;
        // 3.开始采样
        [self.manager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
            
            if (error) {
                NSLog(@"%@",error);
            }
            
            CMRotationRate rate = gyroData.rotationRate;
            NSLog(@"x:%f-y:%f-z:%f",rate.x, rate.y, rate.z);
    ```
    4.pull方式代码的实现
    
    ```
    // 1.判断陀螺仪是否可以用
        if (!self.manager.isGyroAvailable) {
            NSLog(@"");
            return;
        }
    
        // 2.开始采样
        [self.manager startGyroUpdates];
        
        CMRotationRate rate = self.manager.gyroData.rotationRate;
        NSLog(@"x:%f-y:%f-z:%f",rate.x, rate.y, rate.z);
    ```
    ---------------------------------------------------
    
    # 4.摇一摇
    - 监听用户是否摇晃了手机
    - iOS自带的Shake监控API
    
    ```
    - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 检测到摇动 */
    - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 摇动取消(被中断) */
    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event /** 摇动结束 */
    ```
    ----------------------------------------------------
    # 5.计步器
    
    ## 一.计步器的介绍
    - 主要用来统计用户行走的步数
    
    ## 二.计步器的实现
    - 计步器的API封装在了CoreMotion框架中
    - iOS7时使用CoreMotion框架中的CMStepCounter
    - iOS8时使用CoreMotion框架中的CMPedometer
    
    
    #####  代码实现
    - iOS7
    
    ```
    // 1.判断计步器是否可以用
        if (![CMStepCounter isStepCountingAvailable]) {
            NSLog(@"计步器不可用");
            return;
        }
        
        // 2.创建计步器
        CMStepCounter *stepCounter = [[CMStepCounter alloc] init];
        // 3.开始计步
        [stepCounter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@",error);
            }
            NSLog(@"%ld",numberOfSteps);
        }];
    
    ```
    
    - iOS8
    
    ```
    // 1.判断计步器是否可用
        if (![CMPedometer isStepCountingAvailable]) {
            NSLog(@"计步器不可用");
            return;
        }
        
        // 2.创建计步器
        self.pedometer = [[CMPedometer alloc] init];
        // 3.开始计步
        [self.pedometer startPedometerUpdatesFromDate:[NSDate date] withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@",error);
                return;
            }
            NSLog(@"%@",pedometerData.numberOfSteps);
        }];
        
        // 3.查询前几天走了多少步 (最多查询7天)
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        formatter.dateFormat = @"yyyy-MM-dd";
        NSDate *fromDate = [formatter dateFromString:@"2016-09-07"];
        NSDate *toDate = [formatter dateFromString:@"2016-09-09"];
        [self.pedometer queryPedometerDataFromDate:fromDate toDate:toDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
            if (error) {
                NSLog(@"%@", error);
                return ;
            }
            NSLog(@"%@",pedometerData.numberOfSteps);
        }];
    
    ```

    相关文章

      网友评论

      本文标题:iOS中的各种传感器

      本文链接:https://www.haomeiwen.com/subject/xoieettx.html