随着二维码的普遍使用,二维码扫描也成为了很多app的一个基本功能,本篇主要来介绍一下如何实现一个简单的二维码扫描功能。本文使用了XCode自带的AVFoundation

库,利用Swfit语言实现。

实现的步骤如下:

1.获取视频设备(Video)

  在二维码扫描中,我们的输入流是视频。我们需要enable视频设备来获取相应的元数据。

2. 创建Session来处理视频的输入输出流

3. 创建输入输出流,并添加至Session中

4. 处理二维码数据

  该方法是AVCaptureMetadataOutputObjectsDelegate的一个成员方法,我们需要实现它

~~~~~~~~~~~~~~~~~~~~~~~~~我是代码:)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//
// ViewController.swift
// QrCodeTest
//
// Created by XuAlvin on 2/2/16.
// Copyright © 2016年 XuAlvin. All rights reserved.
// import UIKit
import AVFoundation
class ViewController: UIViewController,AVCaptureMetadataOutputObjectsDelegate { var session:AVCaptureSession? override func viewDidLoad() {
super.viewDidLoad() //获取摄像设备,注意是Video而不是Audio
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
//初始化AV Session来协调和处理AV的输入和输出流
let session = AVCaptureSession() //创建输入流
let input:AVCaptureDeviceInput? = try! AVCaptureDeviceInput(device: device) if session.canAddInput(input){
session.addInput(input)
} //创建输出流
let output:AVCaptureMetadataOutput = AVCaptureMetadataOutput()
if session.canAddOutput(output){
session.addOutput(output)
//设置输出流代理,从接收端收到的所有元数据都会被传送到delegate方法,所有delegate方法均在queue中执行
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
//设置元数据的类型,这里是二维码QRCode
output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
} //创建视频设备拍摄视频区域,本例中是全屏
let layer:AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.init(session: session)
layer.videoGravity = AVLayerVideoGravityResizeAspectFill
layer.frame=self.view.layer.bounds
self.view.layer.insertSublayer(layer, atIndex: 0)
//开始采集视频数据
session.startRunning()
} //实现AVCaptureMetadataOutputObjectsDelegate的成员方法来处理二维码信息
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
session?.stopRunning() //获取二维码信息元数据
if let metadataObjects = metadataObjects.first{
let readableObject = metadataObjects as! AVMetadataMachineReadableCodeObject //添加震动
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
//弹出二维码信息
let alertCtl : UIAlertController = UIAlertController(title: "二维码信息", message: readableObject.stringValue, preferredStyle: UIAlertControllerStyle.Alert) //添加action到uialertcontroller,action是UIalertcontroller上的按钮操作,建议至少添加一个,如果不添加,alertcontroller就没有相应的按钮退出 let alertAction : UIAlertAction = UIAlertAction(title: "Action", style: UIAlertActionStyle.Default, handler: { (param : UIAlertAction!) -> Void in
print("I am alert action") })
alertCtl.addAction(alertAction)
//显示alert controller
self.presentViewController(alertCtl, animated: true, completion: nil)
}
}
}

  

iOS二维码扫描的实现(Swift)的更多相关文章

  1. Ios二维码扫描(系统自带的二维码扫描)

    Ios二维码扫描 这里给大家介绍的时如何使用系统自带的二维码扫描方法和一些简单的动画! 操作步骤: 1).首先你需要搭建UI界面如图:下图我用了俩个imageview和一个label 2).你需要在你 ...

  2. iOS二维码扫描IOS7系统实现

    扫描相关类 二维码扫描需要获取摄像头并读取照片信息,因此我们需要导入系统的AVFoundation框架,创建视频会话.我们需要用到一下几个类: AVCaptureSession 会话对象.此类作为硬件 ...

  3. iOS - 二维码扫描和应用跳转

    序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如ZXing或者ZBar.使用时集成麻烦, ...

  4. ios二维码扫描插件,适配当前主流扫描软件,自定义扫描界面。

            二维码介绍: 二维码(QR(Quick Response)code),又称二维条码,最早起源于日本. 它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形,是所有信息 ...

  5. iOS 二维码扫描 通过ZBar ZXing等第三方库

    扫描二维码的开源库有很多如 ZBar.ZXing等 ZBar的使用方法: 下载ZBar SDK 地址https://github.com/bmorton/ZBarSDK ZBarSDK是一个开源的SD ...

  6. ios二维码扫描

    1.添加AVFoundation.framework框架 2,控制器中实现 //第一步添加AVFoundation.framework框架 #import "ViewController.h ...

  7. iOS 二维码扫描

    // 导入 AVFoundation.framwork 框架#import "HDCodeViewController.h" #import "HDNormalViewC ...

  8. 有关iOS系统中调用相机设备实现二维码扫描功能的注意点(3/3)

    今天我们接着聊聊iOS系统实现二维码扫描的其他注意点. 大家还记得前面我们用到的输出数据的类对象吗?AVCaptureMetadataOutput,就是它!如果我们需要实现目前主流APP扫描二维码的功 ...

  9. iOS开发-二维码扫描和应用跳转

    iOS开发-二维码扫描和应用跳转   序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...

随机推荐

  1. MicrosoftFixit50688 [Windows7事件ID10,WMI错误的解决方法

     Windows7事件记录中有如下错误提示: "Event filter with query "SELECT * FROM __InstanceModificationEve ...

  2. [PPT] PPT 录制视频功能.

    1. 需要PPT 里面增加进截图, 发现还不如 直接插入视频合理 本来想了一种方式是 使用 screen to gif 的工具 生成gif 来处理. 后来 发现ppt 里面自带一个 屏幕录制功能. 2 ...

  3. mysql实现消息队列

    mysql之消息队列   消息队列:在消息的传输过程中保存消息的容器. 消息队列管理器在将消息从它的源中继到它的目标时充当中间人.队列的主要目的是提供路由并保证消息的传递:如果发送消息时接收者不可用, ...

  4. Flyway学习笔记

    Flyway做为database migration开源工具,功能上像是git.svn这种代码版本控制.google搜索database migration,或者针对性更强些搜索database mi ...

  5. 用ul li实现边框重合并附带鼠标经过效果

    边框重合这个效果并不难,只是我们没有真正的动手做过而已,下面让我们来谈谈用ul li如何实现边框重合,并附带鼠标经过效果 <!DOCTYPE html> <html lang=&qu ...

  6. P3216 [HNOI2011]数学作业

    题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算Concatenate (1 .. N) Mod M 的值,其中 Concatenat ...

  7. P3455 [POI2007]ZAP-Queries

    题目描述 Byteasar the Cryptographer works on breaking the code of BSA (Byteotian Security Agency). He ha ...

  8. NOIP2017 游记

    没考多好......并不知道该写什么...... 那就写写流水账...... DAY 0 上午到机房,众人全是打板子or颓废的....然后我打完板子去打印了个奇怪的背包九讲.... 然后大巴到德州东, ...

  9. 出错:ORA-20000: ORU-10028: line length overflow, limit of 255 bytes per line?

    起因:DBMS_OUTPUT.put(V_SQL) 提示太长错误,设置了buffer=>null 和set 长度都不行 解决方法如下: testxx.debug_print(V_SQL); -- ...

  10. 【刷题】BZOJ 4636 蒟蒻的数列

    Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个区间中所有比k小的数改为k,他想 ...