文/千煌89(简书作者)
原文链接:http://www.jianshu.com/p/6b7d54b3f88b
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

之前很多二维码扫描都是基于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;
    }

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

iOS扫一扫功能开发相关推荐

  1. 微信扫码支付功能(1)---通过谷歌二维码工具生成付款码

    生成付款二维码 一.微信网站扫码支付介绍 1.扫码支付文档 微信开发官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5 ...

  2. IOS开发(17)IOS 使用LBXScan框架开发扫一扫功能

    说起IOS开发,我是个新手,最近公司接到的项目,C.C++都快忘光的我做IOS开发表示又很大的压力.无奈,还是的搞.找了找资料,看了几天就走在了IOS APP开发的道路上. 在做扫一扫功能,由于自己没 ...

  3. flutter开发实战-flutter二维码条形码扫一扫功能实现

    flutter开发实战-flutter二维码条形码扫一扫功能实现 flutter开发实战-flutter二维码扫一扫功能实现,要使用到摄像头的原生的功能,使用的是插件:scan 效果图如下 一.扫一扫 ...

  4. Android开发扫一扫功能,Android使用ZXing实现扫码功能

    最近正在开发app,基本功能已开发完成,剩下扫码识别功能.之前上级已经写了一版,不是很好用,让我自己好好琢磨一下.针对这种功能需求,一般就先google,看有没有现成的代码可用,不出所料,果然有很多. ...

  5. android studio开发整合资源简单实现android扫一扫功能

    开发安卓app过程中需要集成扫码功能,搜索的时候发现了 http://blog.csdn.net/yuzhiqiang_1993/article/details/52805057 这篇博客文章,写的很 ...

  6. uniapp——开发微信H5调用jweixin微信js-sdk(uniapp开发H5使用微信扫一扫功能)

    小伙伴们,大家有没有开发过网页或者H5等等web页面时候遇到需要调用微信的jweixin.js的呢? 小编在开发过程中遇到了一个问题,因为我的项目是微信小程序内链的H5页面,所以当时我就使用uniap ...

  7. 微信网页开发(10)--扫一扫功能接口

    点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. 背景 2. 代码 3. 测试 1. 背景 我们可以在微信网页调起扫一扫功能,可以识别一维码.二维码的内容 ...

  8. iOS之实现“摇一摇”与“扫一扫”功能

    "摇一摇"功能的实现: iPhone对 "摇一摇"有很好的支持,总体说来就两步: 在视图控制器中打开接受"摇一摇"的开关; - (void) ...

  9. JS_微信公众号开发调用扫码支付功能

    需要在公众号里面切入扫码功能 前端代码: <!DOCTYPE html> <html> <head lang="en"><meta cha ...

  10. .NET微信网页开发之使用微信JS-SDK调用微信扫一扫功能

    前言: 之前有个项目需要调用微信扫描二维码的功能,通过调用微信扫码二维码功能,然后去获取到系统中生成的二维码信息.正好微信JS-SDK提供了调用微信扫一扫的功能接口,下面让我们来看看是如何实现的吧. ...

最新文章

  1. NC:港大张彤团队-基于组学的耐药基因风险评估框架
  2. 将CAD图纸转换出来的图片怎么设置其为高清JPG格式?
  3. ubuntu16 kubernetes1.6安装(六、node节点部署)
  4. Linux环境下c语言静态链接库和动态链接库创建和使用
  5. Mysql中的增删改查操作
  6. STM32F1笔记(十)PWM
  7. javascript 里Array的一些方法
  8. java nio copy_使用NIO快速复制Java文件
  9. 50.本地VMware环境虚拟机的异地(Azure)容灾(上)
  10. 《ANTLR 4权威指南 》一导读
  11. js控制input只能输入数字和小数点后两位,输入其他自动清除方法。
  12. 启动和停止数据库——停止例程
  13. windows下用navicat远程链接虚拟机Linux下MySQL数据库
  14. 手工安装hr表+oracle,[20200825]手工安装HR schema.txt
  15. process.env详解
  16. JPA 查询 未查询到时返回的list的size为0 但是引用并不为空
  17. 双臂二指魔方机器人的制作(一)--总体设计
  18. 全国计算机二级下次报名时间,全国计算机二级考试报名时间
  19. 分清概念十分重要系列之--关于GPS,你需要了解这些
  20. Windows 查看文件大小

热门文章

  1. html5在哪编辑器,HTML5文本编辑器推荐-属于Web开发人员的HTML5编辑器
  2. 面向大数据的分布式调度
  3. 50 岁的 C 语言,掌控 Windows、Linux、macOS 等操作系统半边天
  4. C语言制作的讯飞语音合成、识别、唤醒标准调用接口DLL
  5. matlab中dcsk,【网安学术】煤矿井下MIMO-CD-FM-DCSK通信性能的分析
  6. Unity射击游戏发射子弹的方法和提升流畅性的小技巧
  7. Win11系统点击wifi图标没有反应怎么解决?
  8. 软件架构师-论文写作要求-摘要-扣分原则-加分原则-不及格
  9. Python处理空间地理数据
  10. 微信开放平台之公众号第三方平台开发及全网发布验证