博客> iOS 传感器集锦
iOS 传感器集锦
2019-12-08 06:49 评论:0 阅读:613 wslcmk
加速计 指纹识别 运动传感器 环境光感 距离传感器 磁力计

指纹识别、运动传感器、加速计、环境光感、距离传感器、磁力计、陀螺仪

效果预览.gif

一、指纹识别

应用:指纹解锁、指纹登录、指纹支付

苹果从iPhone5S开始,具有指纹识别技术,从iOS8.0之后苹果允许第三方 App 使用 Touch ID进行身份验证。 连续三次指纹识别错误后,会自动弹出密码框,通过Touch ID的密码进行身份验证,如果此时取消密码验证,再2次指纹识别失败后,也就是 3 + 2 = 5次指纹识别失败后,Touch ID功能被锁定,就只能通过密码来进行身份验证和解锁Touch ID 功能。

指纹.png

全部代码如下:

#import <LocalAuthentication>

-(void)OnTouchIDBtn:(UIButton *)sender{
    //判断设备是否支持Touch ID 
    if ([[UIDevice currentDevice].systemVersion floatValue] < 8 xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed>应用:水平位置测试、摇一摇、计步器、游戏、特效动画

>加速计和运动传感器主要监测设备在X、Y、Z轴上的加速度 ,根据加速度数值,就可以判断出在各个方向上的作用力度,陀螺仪主要用来监测设备的旋转方向和角度。

>这几个传感器都是依赖于苹果官方CoreMotion框架,用法都差不多,先判断各个传感器是否可用开启,然后设置各个传感器的采集频率,接着就开始采集数据,并返回采集到的运动信息参数:各个方向的重力加速度、旋转方向角度等等。

![网络图片.png](http://upload-images.jianshu.io/upload_images/1708447-4d69990c9edffeca.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
![网络图片.jpg](http://upload-images.jianshu.io/upload_images/1708447-518728c961f0e78f.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1240)

* 示例效果:图片旋转的第一张图片用于检测设备是否处于水平位置,第二张图是设备无论在竖直/水平方向上怎么旋转,图片都保持于水平/竖直方向垂直。滚动小球不仅用了加速计,还用到了CoreMotion框架中行为管理CMMotionManager中的碰撞、重力行为,和动力学属性:摩擦、密度、弹力、阻力等

![图片旋转.png](http://upload-images.jianshu.io/upload_images/1708447-6c05485d5a684cac.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)

![滚动小球.gif](http://upload-images.jianshu.io/upload_images/1708447-d0cea0f0bdf6b215.gif?imageMogr2/auto-orient/strip)

* 运动传感器的示例代码如下,其它的用法都差不多,只是相关的方法名称、属性名称和返回的参数类型和值不同,详情可以看demo,注释还算清晰;对于眼镜的绘制可以看下我之前的笔记:[CALayer系列、CGContextRef、UIBezierPath、文本属性Attributes](http://www.jianshu.com/p/d6e090ed542b)

self.motionManager= [[CMMotionManager alloc] init]; //判断设备运动传感器是否可用 if(!self.motionManager.isDeviceMotionAvailable){ NSLog(@"手机没有此功能,换肾吧"); } //更新速率是100Hz self.motionManager.deviceMotionUpdateInterval = 0.1; //开始更新采集数据 //需要时采集数据 //[motionManager startDeviceMotionUpdates]; //实时获取数据 [self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion _Nullable motion, NSError _Nullable error) { //获取X的值 double x = motion.gravity.x; //手机水平位置测试 //判断y是否小于0,大于等于-1.0 if(motion.gravity.y < 0>= -1.0){ //设置旋转 [imageView1 setRotation:80 motion.gravity.y]; }else if (motion.gravity.z -1 > 0 && motion.gravity.z -1 <= 1.0){ [imageView1 setRotation:80 - (80 motion.gravity.z * -1)]; }
//X、Y方向上的夹角 double rotation = atan2(motion.gravity.x, motion.gravity.y) - M_PI; NSLog(@"%.2f",rotation); //图片始终保持垂直方向 imageView2.transform = CGAffineTransformMakeRotation(rotation); }];

##三、环境光感处理器
> 应用:常见的比如说根据环境的亮度去调整屏幕的亮度,在黑暗情况下,手机会自动调暗屏幕亮度,以防刺眼;iPhone 系统相机拍照时光线暗时会自动打开闪光灯;共享单车在黑暗的情况下扫码时检测到特别暗就自动提示打开闪光灯。
* 利用摄像头获取环境光感参数,通过摄像头采集环境参数,然后在代理方法中输出,光感越小,环境越暗,然后根据需要做相应的操作。
* 示例中是环境变暗后就自动提示是否打开闪光灯,打开之后,环境变亮后会自动提示是否关闭闪光灯。

// 1.获取硬件设备 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if (device == nil) { NSLog(@"该换肾了"); return; }

// 2.创建输入流
AVCaptureDeviceInput *input = [[AVCaptureDeviceInput alloc]initWithDevice:device error:nil];
// 3.创建设备输出流
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[output setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
// AVCaptureSession属性
_session = [[AVCaptureSession alloc]init];
// 设置为高质量采集率
[_session setSessionPreset:AVCaptureSessionPresetHigh];
// 添加会话输入和输出
if ([_session canAddInput:input]) {
    [_session addInput:input];
}
if ([_session canAddOutput:output]) {
    [_session addOutput:output];
}
// 9.启动会话
[_session startRunning];

pragma mark- AVCaptureVideoDataOutputSampleBufferDelegate的方法

  • (void)captureOutput:(AVCaptureOutput )captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection )connection {

    CFDictionaryRef metadataDict = CMCopyDictionaryOfAttachments(NULL,sampleBuffer, kCMAttachmentMode_ShouldPropagate); NSDictionary metadata = [[NSMutableDictionary alloc] initWithDictionary:(__bridge NSDictionary)metadataDict]; CFRelease(metadataDict); NSDictionary exifMetadata = [[metadata objectForKey:(NSString )kCGImagePropertyExifDictionary] mutableCopy]; float brightnessValue = [[exifMetadata objectForKey:(NSString *)kCGImagePropertyExifBrightnessValue] floatValue];

    NSLog(@"环境光感 : %f",brightnessValue);

    // 根据brightnessValue的值来打开和关闭闪光灯 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; BOOL result = [device hasTorch];// 判断设备是否有闪光灯 if ((brightnessValue < 0 xss=removed xss=removed xss=removed xss=removed> 0) && result) {// 关闭闪光灯

    if(device.torchMode == AVCaptureTorchModeOn){
        UIAlertController * alertVC  = [UIAlertController alertControllerWithTitle:@"提示" message:@"小主是否要关闭闪光灯?" preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction * openAction = [UIAlertAction actionWithTitle:@"关闭" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            [device lockForConfiguration:nil];
            [device setTorchMode: AVCaptureTorchModeOff];//关
            [device unlockForConfiguration];
        }];
        [alertVC addAction:openAction];
        UIAlertAction * cancleAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { }];
        [alertVC addAction:cancleAction];
        [self presentViewController:alertVC animated:NO completion:nil];
    }

    } }

##四、距离传感器
> 距离传感器: 感应是否有其他物体靠近屏幕,iPhone手机中内置了距离传感器,位置在手机的听筒附近,当我们在打电话或听微信语音的时候靠近听筒,手机的屏幕会自动熄灭,这就靠距离传感器来控制
* 首先打开距离传感器,然后添加通知UIDeviceProximityStateDidChangeNotification监听有物品靠近还是离开,从而做出操作,记得最后要关闭距离传感器,有始有终哦。
* 示例中是默认用扬声器播放音乐,当有物体(比如耳朵)靠近听筒附近时就切换听筒播放音乐,物体离开后就继续用扬声器播放音乐。
  • (void)distanceSensor{ // 打开距离传感器 [UIDevice currentDevice].proximityMonitoringEnabled = YES; // 通过通知监听有物品靠近还是离开 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityStateDidChange:) name:UIDeviceProximityStateDidChangeNotification object:nil]; AVAudioSession audioSession = [AVAudioSession sharedInstance]; //默认情况下扬声器播放 [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil]; [audioSession setActive:YES error:nil]; NSString path = [[NSBundle mainBundle] pathForResource:@"SeeYouAgain" ofType:@"mp3"]; if(path == nil){ return; } _play = [[AVPlayer alloc] initWithURL:[NSURL fileURLWithPath:path]]; [_play play]; }
  • (void)proximityStateDidChange:(NSNotification *)note { if ([UIDevice currentDevice].proximityState) { NSLog(@"有东西靠近"); //听筒播放 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; } else { NSLog(@"有物体离开"); //扬声器播放 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; } }
  • (void)dealloc{ [_play pause]; _play = nil; //关闭距离传感器 [UIDevice currentDevice].proximityMonitoringEnabled = NO; [self removeObserver]; }

##五、磁力计
请看我的上一篇博客:[iOS仿系统指南针](http://www.jianshu.com/p/9d9718876663)
![效果.png](http://upload-images.jianshu.io/upload_images/1708447-fc8b66639ef0290c.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)

传࿆送࿆之࿆门࿆ ——> [传感器集锦](https://github.com/wslcmk/SensorDemo.git) 

温馨提示:请真机调试看效果。

![赞࿆赞࿆.gif](http://upload-images.jianshu.io/upload_images/1708447-3cf20d73fef7fbcd.gif?imageMogr2/auto-orient/strip)
收藏
0
sina weixin mail 回到顶部