ios二维码扫描

作者: 菜鸟晋升路 | 来源:发表于2016-04-25 14:23 被阅读705次

iOS7之前在iOS中加入扫二维码都是用第三方框架,最流行的框架是ZXing,这个框架用起来很麻烦,因为底层是用c语言写的,用到ios工程里来适配过程很麻烦。庆幸的是ios7之后苹果官方提供了官方的API,这个用起来很方便,只需要引入

#import <AVFoundation/AVFoundation.h>

这个头文件就可以,是不是很简单?
我们现在来讲一下实现部分:

 // 1 实例化摄像头设备
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    // An AVCaptureDevice object abstracts a physical capture device that provides input data (such as audio or video) to an AVCaptureSession object.
    
    // 2 设置输入,把摄像头作为输入设备
    // 因为模拟器是没有摄像头的,因此在此最好做个判断
    NSError *error = nil;
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
    if (error) {
        NSLog(@"没有摄像头%@", error.localizedDescription);
        return;
    }
    
    // 3 设置输出(Metadata元数据)
    AVCaptureMetadataOutput *outPut = [[AVCaptureMetadataOutput alloc] init];
    CGRect scanCrop =
    CGRectMake((readerFrame.size.width - viewFinderSize.width)/2,
               (readerFrame.size.height - viewFinderSize.height)/2,
               viewFinderSize.width,
               viewFinderSize.height);
    //设置扫描范围
    outPut.rectOfInterest =
    CGRectMake(scanCrop.origin.y/readerFrame.size.height,
               scanCrop.origin.x/readerFrame.size.width,
               scanCrop.size.height/readerFrame.size.height,
               scanCrop.size.width/readerFrame.size.width
               );
    
    // 3.1 设置输出的代理
    // 使用主线程队列,相应比较同步,使用其他队列,相应不同步,容易让用户产生不好的体验。
    [outPut setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    
    // 4 拍摄会话
    AVCaptureSession *session = [[AVCaptureSession alloc]init];
    session.sessionPreset = AVCaptureSessionPreset640x480;
    // 添加session的输入和输出
    [session addInput:input];
    [session addOutput:outPut];
    // 4.1 设置输出的格式
    [outPut setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
    
    // 5 设置预览图层(用来让用户能够看到扫描情况)
    AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:session];
    // AVCaptureVideoPreviewLayer -- to show the user what a camera is recording
    // 5.1 设置preview图层的属性
    [preview setVideoGravity:AVLayerVideoGravityResizeAspectFill];
    // 5.2设置preview图层的大小
    
    [preview setFrame:self.view.bounds];
    //5.3将图层添加到视图的图层
    [self.view.layer insertSublayer:preview atIndex:0];
    self.previewLayer = preview;
    
    self.session = session;

对于扫描到的二维码信息处理是下面这个方法

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

以上代码是最简单的扫二维码功能实现代码,但我们在实际开发过程中肯定要复杂一些比如需要添加打开闪光灯功能和在相册选择二维码图片进行扫描。其实这个功能很容易实现,直接看代码吧
//实现闪光灯功能代码:

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    NSError *error;
    if (device.hasTorch) {  // 判断设备是否有散光灯
        BOOL b = [device lockForConfiguration:&error];
        if (!b) {
            if (error) {
                NSLog(@"lock torch configuration error:%@", error.localizedDescription);
            }
            return;
        }
        device.torchMode =
        (device.torchMode == AVCaptureTorchModeOff ? AVCaptureTorchModeOn : AVCaptureTorchModeOff);
        [device unlockForConfiguration];
    }

//实现打开相册功能代码(这个需要注意一个地方就是要实现它的代理方法
UINavigationControllerDelegate, UIImagePickerControllerDelegate

 UIImagePickerController *picker = [[UIImagePickerController alloc]init];
    picker.delegate = self;
    [self presentViewController:picker animated:YES completion:nil];

demo git地址(记得给颗星)

相关文章

  • iOS开发:二维码扫描与生成(扫描篇)

    iOS开发中经常要用到生成二维码与扫描二维码的功能,iOS7开始,系统支持原生的扫描二维码,iOS7 扫描二维码可...

  • ZBar

    iOS中使用ZBar扫描二维码自定义扫描界面

  • iOS开发之二维码扫描

    iOS开发之二维码扫描 在 iOS7 以前,在IOS中实现二维码和条形码扫描,我们所知的有,两大开源组件 ZBar...

  • IOS中生成二维码、扫描二维码

    title : IOS中生成二维码、扫描二维码category : UI IOS中生成二维码、保存二维码 标签(空...

  • iOS二维码扫描

    前面我们已经学会了iOS二维码生成相关的知识,这篇文章主要是讲解一下iOS二维码扫描相关的知识. 二维码扫描步骤 ...

  • 二维码扫描和创建(上)

    扫描二维码(包括读取和解码) 扫描二维码OC的开源库有ZBar和ZXing。iOS7以后iOS拥有原生的扫码功能。...

  • 2019-06-03

    iOS二维码扫描//设置条码类型 ****.metadataObjectTypes =@[... - 简书

  • 详细易懂的二维码的扫描、识别与生成

    ios7之前我们实现二维码扫描是借助第三方(ZBar,ZXing等)来实现的,在ios7之后系统自己提供二维码扫描...

  • 二维码扫描

    来源 二维码扫描 ios7之前我们实现二维码扫描一般是借助第三方来实现,但是在ios7之后系统自己提供二维码扫面的...

  • iOS 二维码扫描

    iOS开发中 二维码扫描 前言 在移动开发中二维码扫描这种事情越来越常见了,在iOS中我选择了用ZBar这个第三方...

网友评论

  • 饿狼开发:厉害厉害
  • Clemo:已给星了!很好用,生成二维码也整一个?
  • 菜鸟晋升路:差不多,你的二维码是什么类型的
  • Tang_shuya:github上已给星,谢谢demo。我想问下你这个demo什么类型的二维码都可以扫描么?
  • Mg明明就是你:额,看看打开闪光灯方法😁
    菜鸟晋升路:@Mg明明就是你 可以有的
  • 命中注定IU:@菜鸟晋升路 为什么 我线下的支付都好使到线上支付宝支付 就出现 系统繁忙请稍后再试 (ALI10)
  • ningsf:我想问个问题,今天用ios原生二维码扫描,扫描一个datamatrix码,白底黑色没有问题,但是需要扫描一个黑色金属牌上的白色datamatrix码就不行了,有解决办法吗?求指教
    菜鸟晋升路:@ningsf 那就是说明二维码有问题 你这个二维码怎么生成的?
    ningsf:@菜鸟晋升路 不行啊,没有log信息,没反应
    菜鸟晋升路:@4eba77ce16e3 这个应该没影响 能不能读取到二维码信息?你log一下

本文标题:ios二维码扫描

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