猜猜运用以下哪个传感器:点这里下载(下载了,记得点星星,谢谢!)
传感器的种类
这里主要介绍以下普遍运用的六种:
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];
});
}
}];
}
}