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

序言

前面我们已经调到过怎么制作二维码(点我),在我们能够生成二维码之后,如何对二维码进行扫描呢?

  • 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如ZXing或者ZBar。使用时集成麻烦,出错也不方便调试。在iOS7之后,苹果自身提供了二维码的扫描功能,从效率上来说,原生的二维码远高于这些第三方框架。本文讲解如何使用原生框架实现二维码扫描功能,并且进行扫描后的项目跳转。

ps:本期的源代码会在文章结尾给出链接

扫描相关类

  • 二维码扫描需要获取摄像头并读取照片信息,因此我们需要导入系统的AVFoundation框架,创建视频会话。我们需要用到一下几个类:

    • AVCaptureSession 会话对象。此类作为硬件设备输入输出信息的桥梁,承担实时获取设备数据的责任

    • AVCaptureDeviceInput 设备输入类。这个类用来表示输入数据的硬件设备,配置抽象设备的port

    • AVCaptureMetadataOutput 输出类。这个支持二维码、条形码等图像数据的识别

    • AVCaptureVideoPreviewLayer 图层类。用来快速呈现摄像头获取的原始数据

  • 二维码扫描功能的实现步骤是创建好会话对象,用来获取从硬件设备输入的数据,并实时显示在界面上。在扫描到相应图像数据的时候,通过AVCaptureVideoPreviewLayer类型进行返回
    应用跳转
  • 在使用第三方登陆、分享sdk的时候,我们的项目会在本机安装有目标平台的应用的情况下进行应用跳转,并且传递信息过去。这在沙盒机制下的iOS应用而言,理应是不符合规则的。但是,iOS SDK给我们提供了一个叫做url scheme的机制来实现这个功能。

  • url scheme让我们可以像使用Safari打开网页的方式跳转到其他应用中,并使用类似网络请求的GET请求的参数拼凑方式来在不同应用之间传递数据。

  • 使用url scheme的第一步是在项目的info.plist文件中添加新row,命名为URL types

  • 展开新增的字典,我们修改其中的URL Identifier以及新增加一个字段

URL Schemes。
  • Identifier用来跳转后,让跳转应用识别从哪里跳转过来的,我们可以设置为bundleID反转,来确保其特殊性。

  • URL Schemes是一个数组,我们将在这个数组里面自定义自己的url schemes,这里我们填写应用名。

  • 接着,我们就可以在其他应用中通过openURL:方法打开我们的app。

二维码扫描

  • 二维码扫描的步骤:

    • 1、创建设备会话对象,用来设置设备数据输入

    • 2、获取摄像头,并且将摄像头对象加入当前会话中

    • 3、实时获取摄像头原始数据显示在屏幕上

    • 4、扫描到二维码/条形码数据,通过协议方法回调

  • 会话对象AVCaptureSession的创建

  _session = [AVCaptureSession new];
  [_session setSessionPreset: AVCaptureSessionPresetHigh];    //高质量采集
  [self setupIODevice];
  • setupIODevice方法中懒加载方式创建输入对象和输出对象,注意必须在输出数据对象加入到当前会话后才能设置识别的数据格式。这里设置为扫描二维码以及条形码
  [_session addInput: self.input];
  [_session addOutput: self.output];
  _output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
  • 创建AVCaptureMetadataOutput设置好扫描成功回调代理以及回调线程
  _output = [AVCaptureMetadataOutput new];
  [_output setMetadataObjectsDelegate: self queue: dispatch_get_main_queue()];
  • 创建AVCaptureDeviceInput输入设备为手机摄像头
  AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo];
  _input = [AVCaptureDeviceInput deviceInputWithDevice: device error: nil];
  • 创建AVCaptureVideoPreviewLayer对象来实时获取摄像头图像,我们需要调用[self.view addSubview: self.scanView]把摄像头获取的图像实时展示在屏幕上
  _scanView = [AVCaptureVideoPreviewLayer layerWithSession: self.session];
  _scanView.videoGravity = AVLayerVideoGravityResizeAspectFill;
  _scanView.frame = self.bounds;
  • 实现captureOutput: didOutputMetadataObjects: fromConnection:来获取扫描得到的数据。回调参数metadataObjects中存放了扫描结果,我们需要先判断这个数组的数据个数不为0再执行下面的代码:
  [self stop];
  AVMetadataMachineReadableCodeObject * metadataObject = metadataObjects[0];
  if ([self.delegate respondsToSelector: @selector(scanView:codeInfo:)]) {
      [self.delegate scanView: self codeInfo: metadataObject.stringValue];
      [self removeFromSuperview];
  } else {
      [[NSNotificationCenter defaultCenter] postNotificationName: LXDSuccessScanQRCodeNotification object: self userInfo: @{ LXDScanQRCodeMessageKey: metadataObject.stringValue }];

读取二维码信息进行应用跳转

扫描优化

应用传值

PS查看原文请点击下面提示

本文demo:二维码扫描集成

本文转自:点我坐飞机

拓展Demo:

简单二维码集成,代码量仅需不到十行

你可能感兴趣的:(二维码扫描)