1. 程式人生 > >iOS_二維碼掃描(iOS自帶)

iOS_二維碼掃描(iOS自帶)

iOS7開始,不需要第三方也能進行二維碼掃描了。

之前用過ZBar這個第三方包,後來iOS版本高了用不了,貌似我下的那個包只支援32位。

應該還有其他版本的支援,只是後來沒用到就沒去找了。

今天研究了一下系統自帶的二維碼掃描,掃描速度很快。

肚子餓,節約點時間直接上程式碼,因怎麼用我也有註釋了。大家根據需要看看響應的程式碼吧。


首先,匯入

#import <AVFoundation/AVFoundation.h>

Ps:自己練習的時候,順便複習了一下block傳值和代理傳值,在此程式碼也一起上了吧,不懂的可以看看,自己也權當做個筆記。

先附上掃描VC的.h程式碼

#import </span>"BaseVC.h"
//該viewController是繼承BaseVC(ViewController)建立<pre name="code" class="objc">
@protocol ScanDelegate <NSObject>//新增代理方法(預設情況下必須實現)- (void)setStringValue:(NSString *)stringValue;@optional//可選的方法@[email protected] ScanVC : BaseVC//block傳值@property (strong, nonatomic) void (^stringValue)(NSString *value);//代理傳值@property (strong, nonatomic) id<ScanDelegate>delegate;@end 以下為.m的程式碼
#import "ScanVC.h"
#import <AVFoundation/AVFoundation.h>

@interface ScanVC ()<AVCaptureMetadataOutputObjectsDelegate>

//**
@property (strong, nonatomic) AVCaptureSession *captureSession;
@property (strong, nonatomic) AVCaptureVideoPreviewLayer *videoPreviewLayer;
@property (strong, nonatomic) AVCaptureMetadataOutput *captureMetadataOutput;
@property (strong, nonatomic) UIView *viewPreview;//掃描視窗

@end

@implementation ScanVC

- (void)viewDidLoad {
    [super viewDidLoad];
    /**
     CaptureSession 這是個捕獲會話,也就是說你可以用這個物件從輸入裝置捕獲資料流。
     AVCaptureVideoPreviewLayer 可以通過輸出裝置展示被捕獲的資料流。
     首先,應該判斷當前裝置是否有捕獲資料流的裝置。
     */
    NSError *error;
    AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
    
    if (!input) {
        NSLog(@"%@", [error localizedDescription]);
    }else{
        //設定會話的輸入裝置
        if (!_captureSession) {
            _captureSession = [[AVCaptureSession alloc] init];
        }
        [_captureSession addInput:input];
        
        //對應輸出
        if (!_captureMetadataOutput) {
            _captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
        }
        [_captureSession addOutput:_captureMetadataOutput];
        
        //建立一個佇列
        dispatch_queue_t dispatchQueue;
        dispatchQueue = dispatch_queue_create("myQueue",NULL);
        [_captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue];
        [_captureMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]];//設定條碼型別。更多型別底下補上
        
        //降捕獲的資料流展現出來
        _videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
        [_videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
        
        if (!_viewPreview) {
            _viewPreview = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 320)];
            [self.view addSubview:_viewPreview];
        }        
        [_videoPreviewLayer setFrame:_viewPreview.layer.bounds];
        [_viewPreview.layer addSublayer:_videoPreviewLayer];
        
        //開始捕獲
        [_captureSession startRunning];
    }
}

//獲得的資料在 AVCaptureMetadataOutputObjectsDelegate 唯一定義的方法中
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    //判斷是否有資料,是否是二維碼資料
    if (metadataObjects != nil && [metadataObjects count] > 0) {
        AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
        if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {
            //獲得掃描的資料,並結束掃描
            [self performSelectorOnMainThread:@selector(stopReading:)withObject:metadataObj.stringValue waitUntilDone:NO];
            //執行緒更新label的text值
//            [_result performSelectorOnMainThread:@selector(setText:) withObject:metadataObj.stringValue waitUntilDone:NO];
            //block傳值
            _stringValue(metadataObj.stringValue);
            //代理傳值
            [_delegate setStringValue:metadataObj.stringValue];
        }
    }
}

- (void)stopReading:(id)sender{
    [_captureSession stopRunning];
    _captureSession = nil;
    [_videoPreviewLayer removeFromSuperlayer];
    
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end

掃描型別補充:

AVMetadataObjectTypeQRCode,

AVMetadataObjectTypeCode128Code,

AVMetadataObjectTypeEAN8Code,

AVMetadataObjectTypeUPCECode,

AVMetadataObjectTypeCode39Code,

AVMetadataObjectTypePDF417Code,

AVMetadataObjectTypeAztecCode,

AVMetadataObjectTypeCode93Code,

AVMetadataObjectTypeEAN13Code,

AVMetadataObjectTypeCode39Mod43Code

掃描的程式碼就這些了,以下為上一個VC接收block值和代理傳過來的值:

頭部記得匯入代理<ScanDelegate>(自定義)

</pre><pre>
#pragma mark - 二維碼掃描
//掃描
- (void)scan:(BaseBtn *)button{
    
    ScanVC *scanVC = [[ScanVC alloc]init];
    
    //block 方法
    [scanVC setStringValue:^(NSString *value) {
        NSLog(@"%@",value);
    }];
    //設定代理
    scanVC.delegate = self;
    [self.navigationController pushViewController:scanVC animated:YES];
}
//代理傳值
- (void)setStringValue:(NSString *)stringValue{
    [_result performSelectorOnMainThread:@selector(setText:) withObject:stringValue waitUntilDone:NO];
}



這段程式碼測試能獲取到二維碼的內容,一維碼好像不能掃描,應該跟我的條碼型別設定有關係。

找到比較多的條碼型別,也在上邊進行補充了,只是沒有進行更多測試,有興趣的可以自己去試試哈。

補充一下:

我遇到的問題:當前A_VC呼叫掃描的時候,結束後控制元件會卡住,不能進行任何操作。

我的解決方法:切換到另一個B_VC進行掃描,結束時返回當前A_VC控制元件就不會卡住,若要再次掃描再次進入B_VC即可。

希望能幫到大家。

相關推薦

iOS_掃描iOS

iOS7開始,不需要第三方也能進行二維碼掃描了。 之前用過ZBar這個第三方包,後來iOS版本高了用不了,貌似我下的那個包只支援32位。 應該還有其他版本的支援,只是後來沒用到就沒去找了。 今天研究了一下系統自帶的二維碼掃描,掃描速度很快。 肚子餓,節約點時間直接上程式碼

iOS 掃描你想要的都在這裡了

#pragma mark - imageToTransparent void ProviderReleaseData (void *info, const void *data, size_t size){ free((void*)data); } + (UIImage*)imageBlackToTransp

iOS 原生掃描可限制掃描區域

寫這篇文章的主要原因不是展示如何使用 AVFoundation   來進行二維碼掃描,更主要的是限制掃描二維碼的範圍。(因為預設的是全屏掃描) 專案遇到掃描二維碼的功能需求,這裡我放棄了使用三方庫,而採用了蘋果原生的掃描。 原生的好處就是掃描特別快效率特別高,但是遇到一個問

iOS開發OC——掃描原生API,支援條形碼

今天,我為大家介紹一下iOS原生API實現二維碼和條形碼掃描功能 主要程式碼如下 //獲取攝像裝置 AVCaptureDevice * device = [AVCaptureDevi

使用系統提供的AVFoundation 實現掃描動畫

注意這裡的掃描必須真機測試 模擬器上是看不出來效果的 #import "ViewController.h" #import <AVFoundation/AVFoundation.h> @interface ViewController ()<AVCa

Android實現掃描仿微信,輕量Zxing

前言 要做一個功能,二維碼識別。網上找一堆相關的Demo,但是總不是想要的效果,或者都是多年前的版本,權衡考慮之後,決定親自操刀。不糾結直接選中Zxing框架,https://github.com/zxing/zxing 在網站上直接clone下來,執行,然後就發現問題了.

Android:實際運用Zxing整合掃描定義掃介面demo原始碼

二維碼掃描,各大主流App必不可少的功能,而且google已將輪子替我們造好,直接拿來使用即可。以下是教學如何將Zxing開源庫整合到自己專案中,並且自定義掃碼介面,後期可根據自己的業務需求進行修改,最後補充了一點由此延伸的學習技能點。 一. 整合Zing

[IOS開發]js與WKwebview互動Demo調取掃描

#pragmamark-WKWebDelegate -(void)userContentController:(WKUserContentController*)userContentContr

react-native-smart-barcode目前最好用的掃描元件IOS、android

最近在製作React-Native專案的時候,條碼識別給我們整個專案帶了不少麻煩,幾款主流的條碼識別元件都不是特別好用,使用者體驗比較差,比如二維碼識別速度慢、掃描頁面十分卡頓用等一系列問題,後來在網上無意間找到一個非常好用的二維碼掃描元件——react-native-smart-barcode,這個元件是

Zxing掃描的三個類定義掃描

先新增依賴 compile 'com.journeyapps:zxing-android-embedded:3.3.0' 清單檔案配置許可權 <uses-permission android:name="android.permission.CAMERA" /&

IOS 使用 ZbarSDK 掃描

fill 下載 src uitext void del symbols per super 1. 下載SDK https://github.com/bmorton/ZBarSDK 2. 引用到項目中 3. 添加引用 4. AppDelegate中添加下面代碼 5.

iOS掃描

ont 代碼 畫面 告訴 nds ima dds rst bounds 每一步:添加 AVFoundation.framework 庫 General > Linked Frameworks and Libraries 第二步:代碼集成 #import "V

iOS開發-生成圖片【附中間帶有小圖標QRCode

獲取 options reat 很多 mapr 過濾 生成二維碼 image bit 生成二維碼圖片也是項目中常用到的,二維碼的掃描Git上有很多好用的,這裏主要說下二維碼的生成 1.普通二維碼 1.1 方法 /** 生成二維碼 QRStering:字符串 image

iOS 原生掃描

oca lac sig mediatype gate 5.0 項目 machine lec 直接上項目代碼 首先檢查相機權限 AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusFo

iOS 掃描 Swift

實現相機掃描二維碼, 相簿選取圖片識別二維碼     一. 匯入 framework import AVFoundation//二維碼掃描 import CoreImage//二維碼識別 import AudioToolbox//系統音效 二. 服從協議 AV

iOS 掃描 原生版

     iOS掃描有很多非常成熟的第三方應用,從iOS7以後開始支援原生掃描二維碼,而且效率非常高,整合也很簡單.下面我們來寫下原生掃描方法.直接上圖.swfit 版本. var device: AVCaptureDevice!

Android實現掃描功能-閃光燈控制

簡介 本篇我們對光線暗淡情況下閃光燈的使用做出介紹。 效果 晚上測試時: 開燈後: 未開燈: 實現步驟 1、在activity_scanner.xml介面上加上閃光燈開關按鈕。可以是Button、Checkbox等控制元件。

iOS 掃描-中間透明區域以及掃描區域設定

1. 二維碼掃描 在呼叫二維碼掃描之前,首先匯入標頭檔案:AVFoundation/AVFoundation.h,遵循其協議:AVCaptureMetadataOutputObjectsDelegate。並且定義所需要的device、session、input

iOS原生掃描(可以指定有效區域)

寫這篇文章的主要原因不是展示如何使用 AVFoundation 來進行二維碼掃描,更主要的是限制掃描二維碼的範圍。(因為預設的是全屏掃描) 專案遇到掃描二維碼的功能需求,這裡我放棄了使用三方庫,而採用了蘋果原生的掃描。 原生的好處就是掃描特別快效率特別高,但是遇到一個

Android掃描開發:實現思路與原理

【 回覆“ 1024 ”,送你一個特別推送 】 現在二維碼已經非常普及了,那麼二維碼的掃描與處理也成為了Android開發中的一個必要技能。網上有很多關於Android中二維碼處理的帖子,大都是在講開源框架zxing用法,然後貼貼程式碼就完了,並沒有一個系統的分析和