標籤:
iOS 使用CIDetector掃描相簿二維碼、原生掃描原生掃描
iOS7之後,AVFoundation讓我們終於可以使用原生掃描進行掃碼了(二維碼與條碼皆可)AVFoundation可以讓我們從裝置中擷取到輸入資料流與輸出資料流,從而擷取二維碼中包含的資訊。
實現原生掃描非常簡單。
1.先匯入AVFoundation架構。
<AVFoundation/AVFoundation.h>
2.接著設定代理,實現代理回調方法
AVCaptureMetadataOutputObjectsDelegate
3.然後建立幾個類即可:
裝置 AVCaptureDevice
捕捉會話 AVCaptureSession
輸入資料流 AVCaptureDeviceInput
輸出資料流 AVCaptureMetadataOutput
預覽圖層 AVCaptureVideoPreviewLayer
下面是簡單的代碼實現樣本
NSError *error = nil; AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];//裝置 AVCaptureSession *session = [[AVCaptureSession alloc] init];//捕捉會話 [session setSessionPreset:AVCaptureSessionPresetHigh];//設定採集率 AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];//輸入資料流 AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];//輸出資料流 //添加到捕捉會話 [session addInput:input]; [session addOutput:output]; //掃碼類型:需要先將輸出資料流添加到捕捉會話後再進行設定 //這裡只設定了可掃描二維碼,有條碼需要,在數組中繼續添加即可 [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]]; //輸出資料流delegate,在主線程重新整理UI [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; AVCaptureVideoPreviewLayer *videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];//預覽 videoPreviewLayer.frame = self.view.bounds; [self.view.layer insertSublayer:videoPreviewLayer atIndex:0];//添加預覽圖層 //還可以設定掃描範圍 output.rectOfInterest 不設定預設為全屏 //開始掃描 [session startRunning];
接著實現掃碼成功的回調方法
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { NSString *content = @""; AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects.firstObject; content = metadataObject.stringValue;//擷取到二維碼中的資訊字串 //對此字串進行處理(音效、網址分析、頁面跳轉等)}
- 我們還可以添加掃碼成功後的聲音與震動效果,提高使用者體驗
- (void)playBeep{ SystemSoundID soundID; AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"滴-2"ofType:@"mp3"]], &soundID); AudioServicesPlaySystemSound(soundID); AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);}
從相簿擷取二維碼
ios 中產生二維碼和相簿中識別二維碼