iOS扫一扫功能开发
2016-03-01 11:30
393 查看
之前很多二维码扫描都是基于zxing做的,但是zxing用起来真的很麻烦,又一直不更新。随着iOS6退出历史舞台,终于可以使用iOS7以后,用系统的AVFoundation做的二维码扫描器了。
以上timer是个扫描动画的计时器,可以略过不看。
直接使用openUrl系统自带的浏览器打开url就行,或者自己写个内置的浏览器打开。
那么第三方的二维码扫出来后,会跳向这个网址。
其次在服务器上部署这个页面,加入如下的代码
这段代码是基于url schemes的原理,如果你的app里存在这个url schemes(例子里是test://),那么会立刻打开这个url,如果不存在,就会超过25毫秒,那么就指向另一个页面,一般是下载页。
接着,在app的url schemes里设置,比如test
![](http://upload-images.jianshu.io/upload_images/112047-02cbed263754d71c.png)
Paste_Image.png
这个时候,浏览器发出
最后,如果不满足于扫描二维码只能打开app,想对二维码里的内容做一些操作的话,可以:
将二维码的内容定义成
在js代码里获取这个参数,并原封不动的附加在url schemes后面,如
在appDelegate里加上如下代码。
![](http://upload-images.jianshu.io/upload_images/112047-0557d2677e13c140.png)
34ebbc5ccf91e9deffe7f8d1fead2675.png
![](http://upload-images.jianshu.io/upload_images/112047-259bd2d1b58624b9.gif)
2015-04-08 09_52_30.gif
初始化相机,扫描器
- (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
![](http://upload-images.jianshu.io/upload_images/112047-02cbed263754d71c.png)
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; }
用别人的扫描器扫别人的二维码
![](http://upload-images.jianshu.io/upload_images/112047-0557d2677e13c140.png)
34ebbc5ccf91e9deffe7f8d1fead2675.png
最后来张效果图
![](http://upload-images.jianshu.io/upload_images/112047-259bd2d1b58624b9.gif)
2015-04-08 09_52_30.gif
相关文章推荐
- ios开发--第三方整理
- 根据屏幕宽度自动适配字体大小,一次使用终身难忘!
- iOS presentViewController方式跳转延迟
- iOS多线程
- iOS中block介绍(四)揭开神秘面纱(下)
- IOS-相机、相册
- iOS关于LLDB调试命令学习总结
- iOS 本地头像加载与上传头像图片
- iOS-如何读取Plist文件
- 浅谈iOS中音频的开发
- iOS简单创建一个Framework文件
- iOS开发系列--地图与定位
- iOS之button
- iOS中的正则表达式
- ios开发理解nil,Nil, NULL
- iOS开发系列--IOS程序开发概览
- iOS8TestFlight内部测试和iTuneConnect权限
- iOS开发日期处理
- iOS开发------runtime关联对象(动态添加属性)
- 《编写高质量iOS与OS X代码的52个有效方法》之第二章要点