随着二维码的普遍使用,二维码扫描也成为了很多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) } } }