之前很多二维码扫描都是基于zxing做的,但是zxing用起来真的很麻烦,又一直不更新。随着iOS6退出历史舞台,终于可以使用iOS7以后,用系统的AVFoundation做的二维码扫描器了。

初始化相机,扫描器

- (void)setupCamera
{dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{// 耗时的操作// Device_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];// Input_input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];// Output_output = [[AVCaptureMetadataOutput alloc]init];//    [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];[_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];// Session_session = [[AVCaptureSession alloc]init];[_session setSessionPreset:AVCaptureSessionPresetHigh];if ([_session canAddInput:self.input]){[_session addInput:self.input];}if ([_session canAddOutput:self.output]){[_session addOutput:self.output];}// 条码类型 AVMetadataObjectTypeQRCode_output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode];dispatch_async(dispatch_get_main_queue(), ^{// 更新界面// Preview_preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session];_preview.videoGravity = AVLayerVideoGravityResizeAspectFill;//    _preview.frame =CGRectMake(20,110,280,280);_preview.frame = self.view.bounds;[self.view.layer insertSublayer:self.preview atIndex:0];// Start[_session startRunning];});});
}

在viewWillAppear和viewWillDisappear里对session做优化。

-(void)viewWillAppear:(BOOL)animated
{[super viewWillAppear:animated];if (_session && ![_session isRunning]) {[_session startRunning];}timer = [NSTimer scheduledTimerWithTimeInterval:.02 target:self selector:@selector(animation1) userInfo:nil repeats:YES];
}- (void)viewWillDisappear:(BOOL)animated
{[super viewWillDisappear:animated];[timer invalidate];
}

以上timer是个扫描动画的计时器,可以略过不看。

处理扫描的结果

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{NSString *stringValue;if ([metadataObjects count] >0){AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];stringValue = metadataObject.stringValue;}[_session stopRunning];[timer invalidate];NSLog(@"%@",stringValue);}

用二维码扫描器扫自己的二维码

NSString *url = [NSURL URLWithString:@"html/judgement.html" relativeToURL:[ZXApiClient sharedClient].baseURL].absoluteString;if ([stringValue hasPrefix:url]) {//如果扫出来的url是自己的域名开头的,那么做如下的处理。}

用二维码扫描器扫别人的二维码

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:stringValue]];

直接使用openUrl系统自带的浏览器打开url就行,或者自己写个内置的浏览器打开。

用别人的扫描器扫自己的二维码

首先将自己的二维码定义成http://www.xxx.com/xxxxx这样的自己域名的url。
那么第三方的二维码扫出来后,会跳向这个网址。

其次在服务器上部署这个页面,加入如下的代码

<script language="javascript">if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) {var loadDateTime = new Date();window.setTimeout(function() {var timeOutDateTime = new Date();if (timeOutDateTime - loadDateTime < 5000) {window.location = "要跳转的页面URL";} else {window.close();}},25);window.location = " test:// ";} else if (navigator.userAgent.match(/android/i)) {var state = null;try {state = window.open("apps custom url schemes ", '_blank');} catch(e) {}if (state) {window.close();} else {window.location = "要跳转的页面URL";}}
</script>

这段代码是基于url schemes的原理,如果你的app里存在这个url schemes(例子里是test://),那么会立刻打开这个url,如果不存在,就会超过25毫秒,那么就指向另一个页面,一般是下载页。

接着,在app的url schemes里设置,比如test

Paste_Image.png

这个时候,浏览器发出test://的请求的时候,就能立刻打开这个app了。

最后,如果不满足于扫描二维码只能打开app,想对二维码里的内容做一些操作的话,可以:

  • 将二维码的内容定义成http://www.xxx.com/xxxxx?uid=xxx这样,当然后面的参数需要加密。
  • 在js代码里获取这个参数,并原封不动的附加在url schemes后面,如test://uid=xxx
  • 在appDelegate里加上如下代码。
    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
    {if ([url.absoluteString hasPrefix:@"test://uid="]) {NSString *uid = [url.absoluteString substringFromIndex:11];NSLog(@"uid=%@",uid);//对uid进行操作} else {//其他的地方抛过来的url,比如微信return [WXApi handleOpenURL:url delegate:self];}return YES;
    }

用别人的扫描器扫别人的二维码

34ebbc5ccf91e9deffe7f8d1fead2675.png

最后来张效果图

IOS二维码扫描功能的实现相关推荐

  1. iOS 自带二维码扫描功能的实现

    #自从iOS7以后中新增了二维码扫描功能.因此可以在不借助第三方类库的情况下简单的写出二维码的扫描功能: 原生的二维码扫描功能在AVFoundation框架下,所以在使用原生的二维码扫描功能时要先导入 ...

  2. Flutter 3.X二维码扫描功能

    Flutter 3.X二维码扫描功能 1. pubspec.yaml文件添加依赖 2使用 3. 源代码 4.第二种方式 4.1 pubspec.yaml文件添加依赖 4.2 使用 源代码 1. pub ...

  3. MUI 结合 HTML5+ 实现的二维码扫描功能

    扫码登录的实现原理 原理解释: 接下来就是对于这个服务的详细实现.首先,大概说一下原理:用户打开网站的登录页面的时候,向浏览器的服务器发送获取登录二维码的请求.服务器收到请求后,随机生成一个uuid, ...

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

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

  5. 基于MUI框架的使用HTML5+实现的二维码扫描功能

                                                                               Barcode的一个实现案例 一.简介 Barco ...

  6. Android实现二维码扫描功能(四)-ZXing识别图片二维码,相册选图

    简介 上一篇 Android实现二维码扫描功能(三)-闪光灯控制介绍了光线较弱情况下开启闪光灯来辅助二维码识别的方法. 本篇我们介绍如何识别相册中的图片(含二维码) 动态演示 使用模拟器录制了动画演示 ...

  7. JavaCV/OpenCV 二维码扫描功能

    JavaCV/OpenCV 二维码扫描功能 怎样配置工程就不再赘述,不清楚的读者可以网上查找资料,二维码扫描功能通过JavaCV实现起来还是挺简单的,主要OpenCV中QRCodeDetector提供 ...

  8. Android实现二维码扫描功能-ZXing识别图片二维码,相册选图

    文章目录 1.演示 2.权限问题 3.实现步骤 4.工具类 5.图片Uri处理(重要更新) 1.演示 2.权限问题 部分朋友在打开相册时遇到读写权限未授权的问题,我在开发的时候没有遇到,也没有注册读写 ...

  9. 使用安卓实现一个二维码扫描功能(基于Android Studio)

    二维码扫描使用很广泛,在这里记录二维码扫描的功能,需要导入第三方的类库. 步骤一:在项目中导入第三方的类库,导入方法:往Android Studio中导入第三方类库文件这篇博客中有详细记录 步骤二:定 ...

最新文章

  1. 【Python】turtle库的小应用
  2. 数据科学中必须知道的5个关于奇异值分解(SVD)的应用
  3. 2022 美国国家工程院院士公布:张宏江等入选海外院士,马斯克及微软CEO在列...
  4. VTK:标记网格用法实战
  5. Java反射课程教程
  6. Python 学习日记第二篇 -- 列表,元组
  7. java用volatile或AtomicBoolean实现高效并发处理 (只初始化一次的功能要求)
  8. linux里的vi/vim编辑器怎么用
  9. # UDIG配图(sld)
  10. IDEA版本控制:文件导航各种颜色含义
  11. ubuntu18 安装caj阅读器 wine
  12. Enhancing Underwater Images and Videos by Fusion
  13. 证件照蓝底变白底的方法
  14. MATLAB遇到问题:错误使用mex的解决办法
  15. 码云上开源JAVA项目收藏
  16. Android多维商品属性SKU选择
  17. cesium开发加载shapefile制作的白膜
  18. Java基础知识学习笔记总结
  19. lisp中窗选线_ssget怎样选择所有的多线lisp语言里面……
  20. 串口硬盘如何使用ghost

热门文章

  1. 回归算法-线性回归分析-正规方程和梯度下降
  2. 2D转3D技术的优势
  3. oracle ebs 请求 待定,EBS 并发请求 计划 fnd_conc_release_classes(示例代码)
  4. 虹科分享 | 盘点世界杯有趣小知识!带你感受体育赛事可视化的快乐!
  5. emacs打造开发环境
  6. 走向云计算之HBase模式设计及表设计案例
  7. ubuntu16.04安装opencv3.4.1
  8. 【ThinkPad E470C 】基本完美 附带镜像EFI等工具-Mojave后续自己升级为10.14
  9. python:print函数打印空行
  10. sql 高级查询语句总结