須要倒入一個框架 AVFoundationweb
1.須要有輸入設備, 數組
2.輸出設備 (解析輸入設備的內容)瀏覽器
3.有一個會話類(輸入輸出完事了須要哪個是輸入那一個是輸出)session
AVCaptureSession 框架
4。一個展現掃描的內容 layeride
二 : 而後建立學習
三:設置代理 --獲取數據優化
會話類不知道哪個是時輸入設備 哪個是 輸出設備的 須要銜接她們atom
去綁定輸入和輸出設備 (作一個是否的判斷)、spa
四:設置掃描類型
五:開始掃描
[self.session startRunning]
六:完成代理方法去處理二維碼
掃描到的是一個數據數組
還須要去找到一個類(是一個類型的) (細節頭文件是沒有提示的) 跳到方法裏去
獲取到了數據 裏面有兩個屬性 obj.stringvalue
七:在iOS9裏面又一個特殊服務 能夠不用加載webview 能夠方便展現網頁
細節:(自帶一相似導航欄的東西 完成 刷新 還帶有分享 也就是系統真正的瀏覽器)
好處:網頁過長的時候 在滾動的過程當中是沒有那個tabbar和導航欄的
只有在最上面的時候纔會顯示那個的tabbar和導航欄
若是你的SFSafariViewController
//
// GASScanViewController.m
// GasManger
//
// Created by Ninesday on 16/6/1.
// Copyright © 2016年 Ninesday. All rights reserved.
//
#import "GASScanViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <SafariServices/SafariServices.h>
@interface GASScanViewController ()<AVCaptureMetadataOutputObjectsDelegate>
//1.輸入設備
@property (nonatomic,strong)AVCaptureDeviceInput *input;
//2.輸出設備
@property (nonatomic,strong)AVCaptureMetadataOutput *output;
//3.會話類
@property (nonatomic,strong) AVCaptureSession *session;
//4.掃描到內容的layer
@property (nonatomic,strong) AVCaptureVideoPreviewLayer *previewlayer;
@end
@implementation GASScanViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//輸入設備
//得先建立設備
AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
self.input = [[AVCaptureDeviceInput alloc]initWithDevice:device error:nil];
//輸出設備
self.output = [AVCaptureMetadataOutput new];
//會話類
self.session = [AVCaptureSession new];
//綁定設備
if ([self.session canAddInput:self.input]) {
[self.session addInput:self.input];
}
if ([self.session canAddOutput:self.output]) {
[self.session addOutput:self.output];
}
//設置代理獲取數據
[self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
//設置掃描的類型
[self.output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
//掃描到內容layer--須要設置會話
self.previewlayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:self.session];
self.previewlayer.frame = self.view.bounds;
[self.view.layer addSublayer:self.previewlayer];
//開始掃描
[self.session startRunning];
}
//- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
//}
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
if (metadataObjects.count >0) {
//1.中止掃描
[self.session stopRunning];
//刪除layer
[self.previewlayer removeFromSuperlayer];
//獲取數據 AVMetadataMachineReadableCodeObject 頭文件沒提示
AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];
NSLog(@"%@", obj.stringValue);