您的位置:首页 > 移动开发 > IOS开发

IOS 对于ios7扫描二维码功能的实现

2014-09-03 09:44 731 查看
在ios7以前,我们开发二维码扫描,或者生产都需要借助第三方的开源库进行开发。

然后升级到ios7时,在passbook中苹果自带二维码扫描功能,而且扫描速度非常快,秒杀一切第三方开源库。所以,我们做二维码的开发选用自带sdk优先级应该高于其他的库。

说到二维码的开发,我们需要用到这两个对象。如下。。

@property (nonatomic,strong) AVCaptureSession *captureSession;

@property (nonatomic,strong) AVCaptureVideoPreviewLayer *videoPreviewLayer;

CaptureSession 这是个捕获会话,也就是说你可以用这个对象从输入设备捕获数据流。

AVCaptureVideoPreviewLayer 可以通过输出设备展示被捕获的数据流。

首先我们应该判断当前设备是否有捕获数据流的设备。

AVCaptureDevice *captureDevice = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];

AVCaptureDeviceInput *input = [AVCaptureDeviceInputdeviceInputWithDevice:captureDevice error:&error];

if (!input) {

NSLog(@"%@", [errorlocalizedDescription]);

return NO;

}

如上,如果捕获到错误,直接返回。
初始化一个CaptureSession对象

_captureSession = [[AVCaptureSessionalloc] init];

设置会话的输入设备

[_captureSession addInput:input];

对应输出

AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutputalloc] init];

[_captureSession addOutput:captureMetadataOutput];

创建一个队列

dispatch_queue_t dispatchQueue;

dispatchQueue = dispatch_queue_create("myQueue",NULL);

[captureMetadataOutput setMetadataObjectsDelegate:selfqueue:dispatchQueue];

[captureMetadataOutput setMetadataObjectTypes:[NSArrayarrayWithObject:AVMetadataObjectTypeQRCode]];

降捕获的数据流展现出来

_videoPreviewLayer = [[AVCaptureVideoPreviewLayeralloc] initWithSession:_captureSession];

[_videoPreviewLayersetVideoGravity:AVLayerVideoGravityResizeAspectFill];

[_videoPreviewLayer setFrame:_viewPreview.layer.bounds];

[_viewPreview.layeraddSublayer:_videoPreviewLayer];

开始捕获
[_captureSession startRunning];

获得的数据在

AVCaptureMetadataOutputObjectsDelegate 唯一定义的方法中

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

判断是否有数据,是否是二维码数据

if (metadataObjects != nil && [metadataObjects count] > 0) {

AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjectsobjectAtIndex:0];

if ([[metadataObjtype] isEqualToString:AVMetadataObjectTypeQRCode]) {

//获得扫描的数据,并结束扫描

[selfperformSelectorOnMainThread:@selector(stopReading:)withObject:metadataObj.stringValuewaitUntilDone:NO];

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二维码 OC