iOS传感器&&CoreMotion框架

小球游戏

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

                                          传感器的种类

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

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];

});

}

}];

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容