iOS二维码扫描的实现(Swift)

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

  

posted on 2016-01-03 05:01  Alvin_Xu  阅读(1978)  评论(0编辑  收藏  举报