一.二维码的介绍
- 二维码是用特定的几何图形来记录信息
- 常用的二维码开发框架有:ZXing和ZBarSDK
- 苹果从iOS7开始集成了二维码的生成和读取功能,并且之前的框架不支持64位,因此目前只使用苹果的框架即可
二.二维码的生成
- 二维码的生成就是将固定的信息生成对应的二维码图形
- 生成二维码的步骤:
- 导入CoreImage框架
- 通过滤镜CIFilter生成二维码
- 创建滤镜对象
- 设置滤镜的默认设置
- 给滤镜设置数据(KVC)
- 获取生成的二维码图形
//1. 创建滤镜
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 2.恢复默认设置
[filter setDefaults];
// 3. 设置数据
NSString *info = @"http://www.jianshu.com/users/57da48d44319/latest_articles";
NSData *infoData = [info dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:infoData forKey:@"inputMessage"];
// 4. 生成二维码
CIImage *im = [filter outputImage] ;
self.imageView.image = [im createNonInterpolatedWithSize:300.0];
三.二维码的扫描
- 二维码扫描就是将二维码的图像读取,并且解析成我们可以识别的信息
- 扫描二维码的步骤
- 读取二维码需要导入AVFoundation框架
- 利用摄像头读取信息,并且输入
- 获取捕捉会话(AVCaptureSession)
- 设置输入(摄像头)
- 设置输出(数据)
- 添加预览图层
- 开始扫描二维码
#pragma mark - 扫描二维码
- (void)scanEWM{
// 1.创建捕捉会话
AVCaptureSession *session = [[AVCaptureSession alloc] init];
self.session = session;
// 2.设置输入(摄像头)
// AVMediaTypeVideo:摄像头 AVMediaTypeAudio:话筒 AVMediaTypeMuxed:弹幕
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
[session addInput:input];
// 3.设置输出(数据)
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutput:output];
// 设置输入的类型,必须在output加入到会话之后来设置
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
// 4.添加阅览图层
AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
layer.frame = self.view.bounds;
[self.view.layer addSublayer:layer];
self.layer = layer;
// 5.开始扫描
[session startRunning];
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
if (metadataObjects.count > 0) {
// 1.获取扫描到的内容
AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
NSLog(@"%@", object.stringValue);
// 2.停止会话
[self.session stopRunning];
// 3.移除预览图层
[self.layer removeFromSuperlayer];
}
}