二維碼是用特定的幾何圖形來記錄信息session
在以前,經常使用的二維碼開發框架有:ZXing和ZBarSDK框架
蘋果從iOS7開始集成了二維碼的生成和讀取功能,而且以前的框架不支持64位,所以目前只使用蘋果的框架便可ide
二維碼的開發spa
生成二維碼code
掃描二維碼對象
二維碼的生成就是將固定的信息生成對應的二維碼圖形圖片
生成二維碼的步驟:開發
導入CoreImage框架rem
經過濾鏡CIFilter生成二維碼get
- 建立濾鏡對象 - 設置濾鏡的默認設置 - 給濾鏡設置數據(KVC) - 獲取生成的二維碼圖形
代碼實現
#import <CoreImage/CoreImage.h> // 1.建立濾鏡對象 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; // 2.設置相關的信息 [filter setDefaults]; // 3.設置二維碼的數據 NSString *dataString = @"http://www.520it.com"; NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; [filter setValue:data forKeyPath:@"inputMessage"]; // 4.獲取輸出的圖片 CIImage *outputImage = [filter outputImage];
二維碼掃描就是將二維碼的圖像讀取,而且解析成咱們能夠識別的信息
掃描二維碼的步驟
讀取二維碼須要導入AVFoundation框架
利用攝像頭讀取信息,而且輸入
- 獲取捕捉會話(**AVCaptureSession**) - 設置輸入(攝像頭) - 設置輸出(數據) - 添加預覽圖層 - 開始掃描二維碼
代碼實現
#import <AVFoundation/AVFoundation.h> - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 1.獲取捕捉會話 AVCaptureSession *session = [[AVCaptureSession alloc] init]; self.session = session; // 2.設置捕捉會話的輸入設備 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 setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]]; // 4.添加掃描閱覽的layer AVCaptureVideoPreviewLayer *player = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; player.frame = self.view.bounds; self.layer = player; [self.view.layer addSublayer:player]; // 5.開始掃描 [session startRunning]; } #pragma mark - 實現元數據的回調方法 - (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]; } }