扫描二维码
- 读取二维码需要导入AVFoundation框架
- 利用摄像头识别二维码中的内容(模拟器不行)
- 输入(摄像头)
- 由会话将摄像头采集到的二维码图像转换成字符串数据
- 输出(数据)
- 由预览图层显示扫描场景
简单设置扫描二维码的代码如下:
// 1. 实例化拍摄设备 AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; // 2. 设置输入设备 AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil]; // 3. 设置元数据输出 // 3.1 实例化拍摄元数据输出 AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init]; // 3.3 设置输出数据代理 [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; // 4. 添加拍摄会话 // 4.1 实例化拍摄会话 AVCaptureSession *session = [[AVCaptureSession alloc] init]; // 4.2 添加会话输入 [session addInput:input]; // 4.3 添加会话输出 [session addOutput:output]; // 4.3 设置输出数据类型,需要将元数据输出添加到会话后,才能指定元数据类型,否则会报错 [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]]; // 5. 视频预览图层 // 5.1 实例化预览图层 AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:_session]; preview.videoGravity = AVLayerVideoGravityResizeAspectFill; preview.frame = self.view.bounds; // 5.2 将图层插入当前视图 [self.view.layer insertSublayer:preview atIndex:100]; self.previewLayer = preview; // 6. 启动会话 [_session startRunning];
扫描到数据的回调方法:
#pragma mark - 实现output的回调方法 // 当扫描到数据时就会执行该方法 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { if (metadataObjects.count > 0) { //获取扫描数据 AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject]; NSLog(@"%@", object.stringValue); // 停止扫描 [self.session stopRunning]; // 将预览图层移除 [self.layer removeFromSuperlayer]; } else { NSLog(@"没有扫描到数据"); } }