文档章节

IOS --自带二维码扫描

求是科技
 求是科技
发布于 2015/02/26 09:27
字数 596
阅读 119
收藏 0

具体的可以参考这篇文章:http://www.appcoda.com/qr-code-ios-programming-tutorial/

      最近由于公司项目需要,我负责二维码的生成和扫描部分。由于苹果规定自2015/02/01后上架的作品必须支持64位,所以经过综合比较后,二维码的扫描部分我决定采用苹果自带的AVFoundation框架来实现扫描,网上有很多关于ZBar和Zxing的例子,有兴趣的朋友可以去研究下。

      1.使用前先加入框架头文件和代理信息,如下:

#import <AVFoundation/AVFoundation.h>
@interface QRCodeViewController : UIViewController<AVCaptureMetadataOutputObjectsDelegate>

      2.用到如下几个类

@property (strong,nonatomic) AVCaptureDevice *device;
@property (strong,nonatomic) AVCaptureDeviceInput *input;
@property (strong,nonatomic) AVCaptureMetadataOutput *output;
@property (strong,nonatomic) AVCaptureSession *session;
@property (strong,nonatomic) AVCaptureVideoPreviewLayer *preview;

     3.具体用法如下

    //Device
    device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
     //Input
    input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
     //判断是否有输入
    if (!input)
    {
        NSLog(@"error info:%@",[error localizedDescription]);
        return NO;
    }
     //Session
    session = [[AVCaptureSession alloc] init];
    [session setSessionPreset:AVCaptureSessionPresetHigh];
    [session addInput:input];
     //Output
    output = [[AVCaptureMetadataOutput alloc] init];
    [session addOutput:output];
    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    //条码类型
    [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
     //preview,扫描区域
    preview = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
    [preview setVideoGravity:AVLayerVideoGravityResizeAspectFill];
    //设置扫描区域
    [preview setFrame:frameView.layer.bounds];
    //将扫描view放在self.frameView上
    [self.frameView.layer addSublayer:preview];
    //Start
    [session startRunning];

      4.扫描到二维码后的操作,扫描到二维码之后就会调用如下方法

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
    NSString *stringValue;
    if (metadataObjects !=nil && [metadataObjects count] >0)
    {
        AVMetadataMachineReadableCodeObject *metadataObject = [metadataObjects objectAtIndex:0];
        //判断取到的对象类型
        if ([[metadataObject type] isEqualToString:AVMetadataObjectTypeQRCode])
        {
            [scanResult performSelectorOnMainThread:@selector(setText:) withObject:[metadataObject stringValue] waitUntilDone:NO];
        stringValue = [metadataObject stringValue];
        NSLog(@"扫描结果:%@",stringValue);
        
//        //直接跳往处理二维码controller
//        ProcessRQViewController *processRQViewController = [[ProcessRQViewController alloc] init];
//        //将取到的二维码的值传过去
//        processRQViewController.RQResult = stringValue;
//        //[self.navigationController pushViewController:processRQViewController animated:true];
//        [self presentViewController:processRQViewController animated:YES completion:NULL];
        
//        //直接跳往下载图片的页面
//        ProcessImageViewController *processImageViewController = [[ProcessImageViewController alloc] init];
//        //将取到的二维码的值传过去
//        processImageViewController.ImageResult = stringValue;
//        //跳转
//        [self presentViewController:processImageViewController animated:YES completion:NULL];
}

      5.至此结束

       本人亲测,好多二维码都可以扫描出来。但是在2月13号这天,项目经理让我用这个app扫描本公司营业执照二维码的时候,只能扫出营业执照前面的数字(本公司的营业执照:数字(一连串)+空一格+汉字(好几个)+空一格+一个连接地址)。找出bug后来不及修改,就直接过年了,如今过年来了,要及时堵住这个bug了。


    







© 著作权归作者所有

共有 人打赏支持
求是科技
粉丝 91
博文 439
码字总数 226317
作品 0
成都
后端工程师
私信 提问
越狱的 iPhone、iPad 通过网站实现一键安装 ipa 格式的 APP 应用

1、已经越狱的 iPhone、iPad 设备,当通过其自带的 safari 浏览器访问 ipa 应用下载网站时,利用 itms-services 协议,可以一键安装 ipa 文件的 iOS 应用,例如: <a href="itms-services:/...

问天123
2012/06/29
0
0
Phonegap各类商业插件

【Phonegap商业插件服务】[目前插件已经支持到Phonegap最新版本] 1.phonegap-百度社会化分享-andriod插件 v2.0 【该插件支持微信分享和朋友圈分享,qq好友分享,微博分享】 2.phonegap百度社...

夜澜小雨
2015/07/15
1K
0
在 iOS 中使用 ZBar 扫描二维码

最近在做的项目中需要用到二维码扫描功能,之前在Android中使用过ZXing识别二维码,ZXing也有对应的iOS版本,经过了解,ZBar也是一个常用的二维码识别软件,并分别提供了iOS和Android的SDK可...

鉴客
2014/03/24
3.9K
2
常见的移动端H5页面开发遇到的坑和解决办法

手机共通问题 问题一:用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经研究发现是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显示网页字会非常小,所以苹果...

webmirror
05/02
0
0
Google Goggles 升级到 1.3,连数独都能解了

Google Goggles for Android和Google Mobile for iOS里的Google Goggles功能今天全部升级到了1.3版本,有三大改进。 首先,扫描二维码的速度更快了,几乎就在照相机对准二维码的一瞬间即可完...

戴威
2011/01/11
2.2K
16

没有更多内容

加载失败,请刷新页面

加载更多

GROUP BY GROUPING SETS

GROUPING SETS 子句是 SELECT 语句的 GROUP BY 子句的扩展。通过 GROUPING SETS 子句,您可采用多种方式对结果分组,而不必使用多个 SELECT 语句来实现这一目的。这就意味着,能够减少响应时...

hblt-j
10分钟前
0
0
selenium之表格的定位

真的勇士, 敢于直面惨淡的warning、 敢于正视淋漓的error 目录 被测试网页的HTML代码 1.遍历表格所有单元格 2.定位表格中的某个元素 3.定位表格中的子元素 总结 浏览器网页常常会包含各类表...

程序猿拿Q
15分钟前
0
0
adb命令启动展讯平台工厂模式

adb命令启动展讯工厂模式: adb shell am start com.sprd.engineermode/com.sprd.engineermode.EngineerModeActivity...

东街小霸王
16分钟前
0
0
mtu值怎样设置才网速最快

一、什么是 MTU 值 1 从字面上来说,MTU 是英文 Maximum Transmission Unit 的缩写,即最大传输单元,它的单位是字节。 在我们常用的以太网中,MTU 一般是 1500,而无线路由器默认一般是 14...

Clarence_D
34分钟前
1
0
McAfee阻止邮件发送功能

自己写的邮件发送功能,在本地机器上可以发送,但是放到服务器上面之后就不能发送了,捕获到的异常是“以一个访问权限不允许的方式做了一个访问套接字的尝试”,找了很久,终于发现是被McAfe...

壹峰
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部