二维码扫描

  • 输入设备
  • 输出设备
  • 会话
  • 预览图层
  • 开启会话

导入框架 权限

#import <AVFoundation/AVFoundation.h>
    <key>NSCameraUsageDescription</key>
    <string></string>

输入设备

//输出设备
@property(strong,nonatomic)AVCaptureDeviceInput *deviceInput;
//----------------------------------------------------------------
    //1.1摄像头的设备 默认后置摄像头
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    //1.2创建摄像头的输入设备
    self.deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];

输出设备

//输出设备 Metadata元数据
@property(strong,nonatomic)AVCaptureMetadataOutput *output;
//----------------------------------------------------------------
//2.输出设备 ->解析数据
    self.output = [[AVCaptureMetadataOutput alloc] init];
//设置代理 用来获取数据
    [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
#pragma mark - AVCaptureMetadataOutputObjectsDelegate
//扫描到二维码数据时调用
//metadataObjects:扫描到的数据
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
//扫描到数据之后 移除图层
    [self.previewLayer removeFromSuperlayer];
    //停止会话
    [self.session stopRunning];
    for (AVMetadataMachineReadableCodeObject *objc in metadataObjects) {
        //二维码扫描出来的结果是字符串
        NSLog(@"%@",objc.stringValue);
        //创建safari控制器#import <SafariServices/SafariServices.h>
        SFSafariViewController *safariVC = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:objc.stringValue]];
        [self presentViewController:safariVC animated:YES completion:nil];
    }
}

会话

//会话
@property(nonatomic,strong)AVCaptureSession *session;
//----------------------------------------------------------------
    //3.会话 ->连接输入和输出设备
    self.session = [[AVCaptureSession alloc] init];
    //连接设备
    if([self.session canAddInput:self.deviceInput]){
        [self.session addInput:self.deviceInput];
    }
    if([self.session canAddOutput:self.output]){
        [self.session addOutput:self.output];
    }
    //设置输出设备的解析数据的类型
    //AVMetadataObjectTypeQRCode 二维码
    self.output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];

预览图层

//图层
@property(nonatomic,strong)AVCaptureVideoPreviewLayer *previewLayer;
//-------------------------------------------------------------------------
    //4.预览的图层
    self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session];
    //添加图层
    [self.view.layer addSublayer:self.previewLayer];
    //设置图层的大小
    self.previewLayer.frame = self.view.bounds;

开启会话

    //5.开启会话
    [self.session startRunning];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、扫描 1、 ZBar ZBar在扫描的灵敏度上,和内存的使用上相对于ZXing上都是较优的,但是对于 “圆角二...
    空白Null阅读 1,089评论 0 2
  • 自己的项目大多都是以OC写的,随着swift版本的更新和苹果的力推,学习swift成为刻不容缓的事情,今天我们就聊...
    薄阳映初雪阅读 3,072评论 2 1
  • 简介 二维条码/二维码是用某种特定的几何图形按一定规律在平面分布的黑白相间的图形记录数据符号信息的 在编码上巧妙地...
    论丶道阅读 2,560评论 3 7
  • 二维码生成步骤: 1.导入CoreImage框架 2.通过滤镜CIFilter生成二维码 示例代码: 1.创建过滤...
    ssim阅读 901评论 0 3
  • 文/周寒舟 我遵从她的遗愿,火葬了她,然后带着她的骨灰一路向北,前往中原。 中原武林,有她痴痴念念了一辈子的那个男...
    周寒舟阅读 2,626评论 50 46