整個過程需要四個部分:
1.輸入設備 (攝像頭)
2.輸出設備 (二維碼算法計算的數據結果 元數據)
3.會話 (管理輸入&輸出設備)
4.預覽Layer
演示代碼:
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <SafariServices/SafariServices.h>
@interface ViewController () <AVCaptureMetadataOutputObjectsDelegate>
// 輸入設備 攝像頭)
@property (nonatomic,strong) AVCaptureDeviceInput *input;
// 輸出設備 二維碼算法計算的數據結果 元數據
@property (nonatomic,strong) AVCaptureMetadataOutput *output;
// 會話 (管理輸入&輸出設備)
@property (nonatomic,strong) AVCaptureSession *session;
// 預覽layer
@property (nonatomic,strong) AVCaptureVideoPreviewLayer *previewLayer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 1. 輸入設備 攝像頭
/* 設置輸入設備類型
NSString *const AVMediaTypeVideo;
NSString *const AVMediaTypeAudio;
NSString *const AVMediaTypeText;
NSString *const AVMediaTypeClosedCaption;
NSString *const AVMediaTypeSubtitle;
NSString *const AVMediaTypeTimecode;
NSString *const AVMediaTypeTimedMetadata;
NSString *const AVMediaTypeMetadata;
NSString *const AVMediaTypeMuxed;
*/
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
self.input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
// 2. 輸出設備 二維碼算法計算的數據結果 元數據 (輸出設備的類型必須在輸出設備添加到會話中以后設置)
self.output = [[AVCaptureMetadataOutput alloc]init];
// 獲取數據(設置代理)
[self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
// 3. 會話 管理輸入&輸出設備
self.session = [[AVCaptureSession alloc]init];
// 添加輸入設備&輸出設備到會話中
if([self.session canAddInput:self.input]){
[self.session addInput:self.input];
}
if ([self.session canAddOutput:self.output]) {
[self.session addOutput:self.output];
}
// 設置輸出設備類型 二維碼算法:AVMetadataObjectTypeQRCode
self.output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];
// 4. 預覽Layer
self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
// 添加到當前視圖的Layer中
[self.view.layer addSublayer:self.previewLayer];
// 設置layer的尺寸
self.previewLayer.frame = self.view.bounds;
// 開啟會話
[self.session startRunning];
}
#pragma mark - AVCaptureMetadataOutputObjectsDelegate
/**
* 已經輸出元數據后調用
*
* @param captureOutput 輸出設備
* @param metadataObjects 元數據
* @param connection 連接信息
*/
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
for (AVMetadataMachineReadableCodeObject *obj in metadataObjects) {
//通過stringValue屬性就可以拿到二維碼內的數據
if ([obj.stringValue hasPrefix:@"http"]) {//如果開頭是http說明是一個網頁
// 創建控制器
SFSafariViewController *safariViewController = [[SFSafariViewController alloc]initWithURL:[NSURL URLWithString:obj.stringValue]];
// modal展示
[self presentViewController:safariViewController animated:YES completion:nil];
// 掃描完成后停止持續掃描
[self.session stopRunning];
return;
} else {
NSLog(@"%@",[obj stringValue]);
}
}
}
@end
授權.PNG
modal展示.PNG
這里并不是真的調到了Safari瀏覽器,而是在應用內部以Safari樣式顯示,點擊右下角的Safari瀏覽器按鈕才會真正跳轉到Safari瀏覽器
獲取二維碼內的文字信息:
2016-07-15 19:04:33.536 09-二維碼[731:441146] 只要鋤頭舞的好,哪有墻角挖不倒!
2016-07-15 19:04:33.566 09-二維碼[731:441146] 只要鋤頭舞的好,哪有墻角挖不倒!
2016-07-15 19:04:33.600 09-二維碼[731:441146] 只要鋤頭舞的好,哪有墻角挖不倒!
2016-07-15 19:04:33.633 09-二維碼[731:441146] 只要鋤頭舞的好,哪有墻角挖不倒!
2016-07-15 19:04:33.664 09-二維碼[731:441146] 只要鋤頭舞的好,哪有墻角挖不倒!
2016-07-15 19:04:33.700 09-二維碼[731:441146] 只要鋤頭舞的好,哪有墻角挖不倒!
2016-07-15 19:04:33.734 09-二維碼[731:441146] 只要鋤頭舞的好,哪有墻角挖不倒!