美文网首页I love iOS
iOS传感器&&CoreMotion框架

iOS传感器&&CoreMotion框架

作者: 在逃科学家 | 来源:发表于2017-04-27 23:12 被阅读500次
    小球游戏

    猜猜运用以下哪个传感器:点这里下载(下载了,记得点星星,谢谢!)

                                              传感器的种类

    这里主要介绍以下普遍运用的六种:

    1.距离传感器(Proximity Sensor)

            距离传感器又叫近场传感器,值得是同一种概念,用于检测是否有其他物体靠近设备屏幕.当你打电话或接电话时将电话屏幕贴近耳边,iPhone会自动关闭屏幕 ,好处是节省电量.

    2.磁力计传感器(Magnetometer Sensor)

    可以感应地球磁场, 获得方向信息, 使位置服务数据更精准,可以用于电子罗盘和导航应用,iPad的Smart Cover盒盖睡眠操作就是基于磁力计传感器

    3.内部温度传感器(Internal Temperature Sensor)

    内部温度传感器并不是给开发者用的,而是iPhone检测零件温度过高的一种措施,从 iPad一代开始,iOS设备都加入了一个内部温度传感器,用于检测内部组件温度,当温度超过系统设定的阈值时,会出现提示,如果iPhone内部温度超过系统设置门限时(据说是80℃),就会自动关机并且出现如下警告

    4.湿度传感器(Moisture Sensor)

    湿度传感器跟其他基于微电子的传感器不同,是一个简单的物理传感器.简单来说,湿度传感器就是一张遇水变红的试纸,Apple的维修人员就是通过检测试纸是否变红,来判断设备是否进水,设备进水不在保修范围之内

    5.陀螺仪(Gyroscope)

    陀螺仪是随着iPhone4的上市首次出现在iOS设备上的传感器,陀螺仪可以用于检测设备的持握方式,其的原理是检测设备在X、Y、Z轴上所旋转的角速度. 陀螺仪在赛车类游戏中有重大作用:模拟汽车驾驶时方向盘旋转的动作 ,使得这类游戏的操控体验更真实.陀螺仪是飞机上必不可少的零部件,无论是真实的飞机(战斗机,客机),还是几百块钱的玩具飞机或者几千上万的大疆飞机

    6.加速器(Accelerometer Sensor)

    最早出现在iOS设备上的传感器之一,加速计用于检测设备在X、Y、Z轴上的加速度 (哪个方向有力的作用),加速计可以用于检测设备的摇晃,经典应用场景

    代码运用:(主要是使用CoreMotion框架)

    1.距离传感器:

    - (void)viewDidLoad {

    [super viewDidLoad];

    /**

    proximity:接近

    Monitoring:检测

    */

    //1.开启进场传感器开关

    //    [UIDevice currentDevice].proximityMonitoringEnabled = YES;

    //2.开启进场传感器

    //进场传感器属于iOS系统通知

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChangeNotification) name:UIDeviceProximityStateDidChangeNotification object:nil];

    }

    - (void)proximityStateDidChangeNotification{

    //1.获取当前设备的进场状态

    BOOL state = [UIDevice currentDevice].proximityState;

    if (state == YES) {

    NSLog(@"有逗比靠近你了");

    //设置iPhone屏幕的亮度  0-1

    [[UIScreen mainScreen] setBrightness:0];

    }

    else{

    NSLog(@"逗比被你吓跑了");

    //设置iPhone屏幕的亮度  0-1

    [[UIScreen mainScreen] setBrightness:0.5];

    }

    }

    2.加速器

    #import "ViewController.h"

    //核心运动框架

    #import<CoreMotion/CoreMotion.h>

    @interface ViewController ()

    //运动管理器(不要使用局部变量,否则会被释放导致无法获取)

    @property(nonatomic,strong)CMMotionManager *motitonManager;

    @end

    @implementation ViewController

    //运动管理器(不要使用局部变量,否则会被释放导致无法获取)

    @property(nonatomic,strong)CMMotionManager *motitonManager;

    @end

    @implementation ViewController

    - (void)viewDidLoad {

    [super viewDidLoad];

    //核心运动框架获取数据有两种方式

    /**

    pull:我们手动获取,想要获取直接从运动管理器的属性中获取

    push:系统回调返回数据,当数据发生变化时会主动告诉我们

    */

    //    [self getPullAccelerometer];

    [self getPushAccelerometer];

    }

    //push方式是系统主动告诉我们

    -(void)getPushAccelerometer{

    //1.创建运动管理器

    self.motitonManager = [[CMMotionManager alloc] init];

    //2.检测硬件是否可以使用(硬件损坏的情况下不可用)

    if( [self.motitonManager isAccelerometerAvailable]){

    //如果是push方式则需要3 4 两步

    //3.设置采集率(让系统多少s告诉一次我们数据)  示例设置1s,表示每隔1s种系统返回我们一次当前加速器数据

    self.motitonManager.accelerometerUpdateInterval = 1;

    //.开始检测加速计数据

    //4.开始检测  push方式是通过一个block回调告知我们数据

    [self.motitonManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {

    //.从加速器获取中获取X、Y、Z轴的力度值结构体

    CMAcceleration acceleration = accelerometerData.acceleration;

    /**

    1.当手机处于静止状态时,值在 0 -1之间

    2.当手机home朝下时  Y轴为笛卡尔坐标系(上正下负)  当手机home键朝右时  X轴为笛卡尔坐标  当手机home键朝上 Z轴为笛卡尔坐标系

    */

    NSLog(@"x:%f  y:%f  z:%f",acceleration.x,acceleration.y,acceleration.z);

    }];

    }

    }

    //pull方式的数据需要我们手动去获取

    - (void)getPullAccelerometer{

    //1.创建运动管理器

    self.motitonManager = [[CMMotionManager alloc] init];

    //2.检测硬件是否可以使用(硬件损坏的情况下不可用)

    if( [self.motitonManager isAccelerometerAvailable]){

    //3.开始检测加速计数据

    //pull方式开启检测之后,硬件会将检测到的加速计数据保存在motitonManager的属性中,我们想要获取数据需要手动获取

    [self.motitonManager startAccelerometerUpdates];

    }

    }

    - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{

    //1.获取加速计数据

    CMAccelerometerData *accelerometerData = self.motitonManager.accelerometerData;

    //2.从加速器获取中获取X、Y、Z轴的力度值结构体

    CMAcceleration acceleration = accelerometerData.acceleration;

    NSLog(@"x:%f  y:%f  z:%f",acceleration.x,acceleration.y,acceleration.z);

    }

    @end

    3.陀螺仪:

    #import "ViewController.h"

    //核心运动框架

    #import<CoreMotion/CoreMotion.h>

    @interface ViewController ()

    //运动管理器(不要使用局部变量,否则会被释放导致无法获取)

    @property(nonatomic,strong)CMMotionManager *motitonManager;

    @end

    @implementation ViewController

    - (void)viewDidLoad {

    [super viewDidLoad];

    //核心运动框架获取数据有两种方式

    /**

    pull:我们手动获取,想要获取直接从运动管理器的属性中获取

    push:系统回调返回数据,当数据发生变化时会主动告诉我们

    */

    //    [self getPullGyro];

    [self getPushGyro];

    }

    //push方式是系统主动告诉我们

    -(void)getPushGyro{

    //1.创建运动管理器

    self.motitonManager = [[CMMotionManager alloc] init];

    //2.检测硬件是否可以使用(硬件损坏的情况下不可用)

    if( [self.motitonManager isGyroAvailable]){

    //如果是push方式则需要3 4 两步

    //3.设置采集率(让系统多少s告诉一次我们数据)  示例设置1s,表示每隔1s种系统返回我们一次当前加速器数据

    self.motitonManager.gyroUpdateInterval = 1;

    //.开始检测加速计数据

    //4.开始检测  push方式是通过一个block回调告知我们数据

    [self.motitonManager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {

    CMRotationRate rotationRate = gyroData.rotationRate;

    /**

    静止状态下  值 1 -1 之间

    x,y,x轴的坐标系是右手法则

    手机围绕哪一个轴发生旋转 则哪一个轴发生

    //Home 朝下时 前后翻转 Y方法逆时针为正    左右翻转  Z方向逆时针为正  前后翻转  X方向 往里旋转为正

    */

    NSLog(@"x:%f  y:%f  z:%f",rotationRate.x,rotationRate.y,rotationRate.z);

    }];

    }

    }

    //pull方式的数据需要我们手动去获取

    - (void)getPullGyro{

    //1.创建运动管理器

    self.motitonManager = [[CMMotionManager alloc] init];

    //2.检测硬件是否可以使用(硬件损坏的情况下不可用)

    if( [self.motitonManager isGyroAvailable])

    {

    //3.开始检测加速计数据

    //pull方式开启检测之后,硬件会将检测到的加速计数据保存在motitonManager的属性中,我们想要获取数据需要手动获取

    [self.motitonManager startGyroUpdates];

    }

    }

    - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{

    //1.获取陀螺仪数据

    CMGyroData *GyroData = self.motitonManager.gyroData;

    //2.从陀螺仪获取中获取X、Y、Z轴的角速度值结构体

    CMRotationRate rotationRate = GyroData.rotationRate;

    NSLog(@"x:%f  y:%f  z:%f",rotationRate.x,rotationRate.y,rotationRate.z);

    }

    4.磁力计:

    #import "ViewController.h"

    //核心运动框架

    #import<CoreMotion/CoreMotion.h>

    @interface ViewController ()

    //运动管理器(不要使用局部变量,否则会被释放导致无法获取)

    @property(nonatomic,strong)CMMotionManager *motitonManager;

    @end

    @implementation ViewController

    - (void)viewDidLoad {

    [super viewDidLoad];

    //核心运动框架获取数据有两种方式

    /**

    pull:我们手动获取,想要获取直接从运动管理器的属性中获取

    push:系统回调返回数据,当数据发生变化时会主动告诉我们

    */

    //    [self getPullGyro];

    [self getPushGyro];

    }

    //push方式是系统主动告诉我们

    -(void)getPushGyro{

    //1.创建运动管理器

    self.motitonManager = [[CMMotionManager alloc] init];

    //2.检测硬件是否可以使用(硬件损坏的情况下不可用)

    if( [self.motitonManager isMagnetometerAvailable]){

    //如果是push方式则需要3 4 两步

    //3.设置采集率(让系统多少s告诉一次我们数据)  示例设置1s,表示每隔1s种系统返回我们一次当前加速器数据

    self.motitonManager.magnetometerUpdateInterval = 1;

    //.开始检测加速计数据

    //4.开始检测  push方式是通过一个block回调告知我们数据

    [self.motitonManager startMagnetometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMMagnetometerData * _Nullable magnetometerData, NSError * _Nullable error) {

    CMMagneticField magneticField = magnetometerData.magneticField;

    /**磁场单位有三种

    Oe(奥斯特),A/m(高斯),T(特斯拉)三种.

    1T=1000mT

    1mT=10Oe

    1Oe=80A/m

    1T(特斯拉)=10000Gs(高斯)=1Wb/M2

    1Gs(高斯)=1oe(奥斯特)

    */

    /**

    iOS磁力计单位: 特斯拉:T

    */

    NSLog(@"x:%f y:%f  z:%f",magneticField.x,magneticField.y,magneticField.z);

    }];

    }

    }

    //pull方式的数据需要我们手动去获取

    - (void)getPullGyro{

    //1.创建运动管理器

    self.motitonManager = [[CMMotionManager alloc] init];

    //2.检测硬件是否可以使用(硬件损坏的情况下不可用)

    if( [self.motitonManager isMagnetometerAvailable]){

    //3.开始检测磁力计数据

    //pull方式开启检测之后,硬件会将检测到的加速计数据保存在motitonManager的属性中,我们想要获取数据需要手动获取

    [self.motitonManager startMagnetometerUpdates];

    }

    }

    - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{

    //1.获取磁力计数据

    CMMagneticField magneticField = self.motitonManager.magnetometerData.magneticField;

    NSLog(@"x:%f  y:%f  z:%f",magneticField.x,magneticField.y,magneticField.z);

    }

    5 . 计步器

    #import "ViewController.h"

    #import<CoreMotion/CoreMotion.h>

    @interface ViewController ()

    @property (weak, nonatomic) IBOutlet UILabel *label;

    @end

    @implementation ViewController

    - (void)viewDidLoad {

    [super viewDidLoad];

    [self iOS8SetpCounter];

    }

    - (void)iOS8SetpCounter {

    //1. 判断计步器是否可用

    if (![CMPedometer isStepCountingAvailable]) {

    NSLog(@"计步器不可用");

    return;

    }

    //2. 创建计步器

    CMPedometer *pedometer = [[CMPedometer alloc] init];

    //3. 开始计步统计  start:从什么时间开始

    //iOS8之后的计步器可以检测距离 但是误差相当大  每一个人的每一步距离是不一样  实际开发中检测运动距离用GPS定位

    [pedometer startPedometerUpdatesFromDate:[NSDate date]

    withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {

    //计步器属于子线程

    NSLog(@"%d",[NSThread isMainThread]);

    NSLog(@"%@",[NSThread currentThread]);

    //子线程刷新UI,延迟非常大,而且会存在潜在的闪退

    //在子线程中回到主线程刷新UI  UntilDone:是否立即执行(YES:同步)

    [self performSelectorOnMainThread:@selector(updateUI:) withObject:pedometerData.numberOfSteps waitUntilDone:YES];

    NSLog(@"步数%@",pedometerData.numberOfSteps);

    }];

    }

    - (void)updateUI:(NSNumber *)step{

    NSLog(@"步数======%@",step);

    self.label.text = [NSString stringWithFormat:@"%@ 步",step];

    }

    #pragma mark -iOS7计步器用法

    - (void)iOS7SetpCounter {

    //1. 判断计步器是否可用:iOS7出现的 , iOS8过期了

    if (![CMStepCounter isStepCountingAvailable]) {

    NSLog(@"计步器不可用");

    return;

    }

    //2. 创建计步器

    CMStepCounter *stepCounter = [[CMStepCounter alloc] init];

    //3. 开始计步统计  updateOn:步数更新频率(每走几步告诉一次我们数据)

    [stepCounter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:5 withHandler:^(NSInteger numberOfSteps, NSDate * _Nonnull timestamp, NSError * _Nullable error) {

    NSLog(@"numberOfSteps: %zd", numberOfSteps);

    }];

    }

    注:(以下为拓展摇一摇和指纹识别)

    摇一摇:

    - (void)viewDidLoad {

    [super viewDidLoad];

    /**摇一摇功能

    第一种实现方式:使用系统自带的motionBegan

    第二种摇一摇:利用加速器x轴和y轴的力度感应可以获取手机摇摆的状态。再通过算法计算出用户处于摇一摇*/

    }

    - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{

    NSLog(@"摇一摇开始");

    }

    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{

    NSLog(@"摇一摇结束");

    }

    指纹识别:

    #import "ViewController.h"

    #import<LocalAuthentication/LocalAuthentication.h>

    @interface ViewController ()

    @end

    - (IBAction)authButtonClick:(id)sender {

    //1.创建识别上下文 iOS8新增

    LAContext *context = [[LAContext alloc] init];

    //2.判断当前设备能够使用指纹识别

    /**

    policy:类型

    Authentication:认证

    Biometrics:生物特征识别

    LAPolicyDeviceOwnerAuthenticationWithBiometrics:iOS8指纹识别

    LAPolicyDeviceOwnerAuthentication:iOS9指纹识别  9与8唯一的区别就是输错密码3次之后 iOS9会自动弹出输入密码界面

    */

    if([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:nil]){

    [context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:@"五一打八折,泰式A套餐只要88" reply:^(BOOL success, NSError * _Nullable error) {

    if (error == nil) {

    NSLog(@"指纹识别成功");

    //指纹识别是在子线程中执行的,需要注意不要在子线程中刷新UI

    NSLog(@"%@",[NSThread currentThread]);

    //如果在子线程刷新UI,则会警告This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes.  This will cause an exception in a future release.

    //警告意思  1.刷新UI会失败(延迟非常大 几十秒)  2.不可知的崩溃

    //异步主线程

    dispatch_async(dispatch_get_main_queue(), ^{

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"选个号吧" delegate:nil cancelButtonTitle:@"考虑一下" otherButtonTitles:@"开始上钟", nil];

    [alertView show];

    });

    }

    else

    {

    /**code类型

    -1 :连续输错三次

    -8:三次之后再次输错

    -2:用户点击取消

    -3:用户点击输入密码

    */

    //并不是每一次输错都会走失败方法

    NSLog(@"%@",error);

    //异步主线程

    dispatch_async(dispatch_get_main_queue(), ^{

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"没钱就去找翼老师" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确认", nil];

    [alertView show];

    });

    }

    }];

    }

    }

    相关文章

      网友评论

        本文标题:iOS传感器&&CoreMotion框架

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