iOS 使用CIDetector掃描相冊二維碼、原生掃描

前言

早上使用微信的時(shí)候,突然想到以前在項(xiàng)目中集成掃碼功能,當(dāng)時(shí)沒有從相冊中掃描二維碼的需求,加上需要向下兼容,于是選擇集成了zbar掃描。今天我們就來看一下如何實(shí)現(xiàn)從相冊中掃碼、以及原生掃描。

原生掃描

  • iOS7之后,AVFoundation讓我們終于可以使用原生掃描進(jìn)行掃碼了(二維碼與條碼皆可)AVFoundation可以讓我們從設(shè)備中獲取到輸入流與輸出流,從而獲取二維碼中包含的信息。

  • 實(shí)現(xiàn)原生掃描非常簡單。
    1.先導(dǎo)入AVFoundation框架。
    <AVFoundation/AVFoundation.h>
    2.接著設(shè)置代理,實(shí)現(xiàn)代理回調(diào)方法
    AVCaptureMetadataOutputObjectsDelegate
    3.然后創(chuàng)建幾個(gè)類即可:
    設(shè)備 AVCaptureDevice
    捕捉會話 AVCaptureSession
    輸入流 AVCaptureDeviceInput
    輸出流 AVCaptureMetadataOutput
    預(yù)覽圖層 AVCaptureVideoPreviewLayer

  • 下面是簡單的代碼實(shí)現(xiàn)示例

    NSError *error = nil;
    AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];//設(shè)備
    AVCaptureSession *session = [[AVCaptureSession alloc] init];//捕捉會話
    [session setSessionPreset:AVCaptureSessionPresetHigh];//設(shè)置采集率
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];//輸入流
    AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];//輸出流
    //添加到捕捉會話
    [session addInput:input];
    [session addOutput:output];
    //掃碼類型:需要先將輸出流添加到捕捉會話后再進(jìn)行設(shè)置
    //這里只設(shè)置了可掃描二維碼,有條碼需要,在數(shù)組中繼續(xù)添加即可
    [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
    //輸出流delegate,在主線程刷新UI
    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    AVCaptureVideoPreviewLayer *videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];//預(yù)覽
    videoPreviewLayer.frame = self.view.bounds;
    [self.view.layer insertSublayer:videoPreviewLayer atIndex:0];//添加預(yù)覽圖層
    //還可以設(shè)置掃描范圍 output.rectOfInterest  不設(shè)置默認(rèn)為全屏
    //開始掃描
    [session startRunning];```

* 接著實(shí)現(xiàn)掃碼成功的回調(diào)方法 
  • (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
    NSString *content = @"";
    AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects.firstObject;
    content = metadataObject.stringValue;//獲取到二維碼中的信息字符串
    //對此字符串進(jìn)行處理(音效、網(wǎng)址分析、頁面跳轉(zhuǎn)等)
    }```
  • 我們還可以添加掃碼成功后的聲音與振動效果,提高用戶體驗(yàn)
  - (void)playBeep{
    SystemSoundID soundID;
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"滴-2"ofType:@"mp3"]], &soundID);
    AudioServicesPlaySystemSound(soundID);
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}

從相冊獲取二維碼

  • iOS8之后,可以使用CIDetector(CIDetector可用于人臉識別)進(jìn)行圖片解析,從而使我們可以便捷的從相冊中獲取到二維碼。
  • 1.調(diào)用系統(tǒng)相冊,從系統(tǒng)相冊中選取圖片
    2.使用探測器(CIDetector)對選取的圖片進(jìn)行處理,取得圖片二維碼中包含的數(shù)據(jù)信息。
  • 下面是簡單的代碼實(shí)現(xiàn)示例
  - (void)choicePhoto{
    //調(diào)用相冊
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    imagePicker.delegate = self;
    [self presentViewController:imagePicker animated:YES completion:nil];
}
//選中圖片的回調(diào)
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSString *content = @"" ;
    //取出選中的圖片
    UIImage *pickImage = info[UIImagePickerControllerOriginalImage];
    NSData *imageData = UIImagePNGRepresentation(pickImage);
    CIImage *ciImage = [CIImage imageWithData:imageData];
    
    //創(chuàng)建探測器
    CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyLow}];
    NSArray *feature = [detector featuresInImage:ciImage];
    
    //取出探測到的數(shù)據(jù)
    for (CIQRCodeFeature *result in feature) {
        content = result.messageString;
    }
    //進(jìn)行處理(音效、網(wǎng)址分析、頁面跳轉(zhuǎn)等)
}

源碼

點(diǎn)此下載:github源碼

結(jié)語

原生掃描比zbar、zxing效率更高,且這兩個(gè)庫年久失修(zxingOBJC有人在持續(xù)維護(hù))還有兼容性問題。
CIDetector是系統(tǒng)為我們提供的非常強(qiáng)大的類庫,但是很多公司因?yàn)樾枰蛳录嫒?,所以沒有辦法使用。
如果項(xiàng)目不需向下兼容多個(gè)版本時(shí),建議使用系統(tǒng)原生掃描以及CIDetector進(jìn)行二維碼相關(guān)處理。

參考:
http://www.tuicool.com/articles/ie2aAjv
http://www.lxweimin.com/p/cc79c45b4ccf

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容