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

时间:2022-09-13 19:21:56

随着二维码的普遍使用,二维码扫描也成为了很多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. JCarouselLite--帮助文档

    jcarousellite是一款jquery插件,可以控制文档元素滚动,丰富的参数设置可以控制滚动的更多细节,是一款不可多得的滚动插件. ------------------ 官网地址:http:// ...

  2. mybatis 加载配置文件的两种方式

    package com.atguigu.day03_mybaits.test; import java.io.IOException;import java.io.InputStream;import ...

  3. 帝国CMS内容模板IF判断

    [e:loop={'selfinfo',50,0,0,"jingshu=$navinfor[jingshu]","id"}]<?php$class1=&q ...

  4. discuz 系列产品 在ie9下注册成功后不跳转bug处理

    header.htm 把 <meta http-equiv="x-ua-compatible" content="ie=7" /> 改为 <m ...

  5. crossdomain 可用

    <cross-domain-policy> <allow-access-from domain="*"/> <allow-http-request-h ...

  6. 邮件远控电脑MCC-python实现

    本次实现的是一个通过邮件来远程控制电脑,以达到某些远程操作,例如让电脑执行CMD命令,播放音乐,打开指定文件等操作的项目.代码参考了网上的部分教程. 具体流程: 在python代码中,通过一个循环来接 ...

  7. Debug常用命令

    R命令 查看.修改CPU中寄存器的值 -r ;查看寄存器的值 -r cs ;修改cs寄存器的值 D命令 查看内存中的内容 ;d 段地址:偏移地址 -d 1000:01 ;查看内存100001处的内容 ...

  8. 蓝桥杯 大臣的旅费&lowbar;树的最长度&lowbar;两次DFS

    #include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm&gt ...

  9. win7&sol;win8&sol;win10 php5&period;6 redis扩展&lpar;适用于iis&sol;nginx&sol;apache&rpar;&comma;亲测

    win7 php5.6 redis扩展   步骤: 1.下载redis扩展 redis扩展下载地址:http://windows.php.net/downloads/pecl/snaps/redis/ ...

  10. SDOI 2017 天才黑客

    /* 根据claris的 博客以及 beginend 的博客来写的 首先考虑如何求出最短路 可以从样例看出 路径是从边走到边的, 所以我们将边看作点 有共同端点的两边之间 互相连边, 边权为lcp. ...