文档章节

IOS --自带二维码扫描

求是科技
 求是科技
发布于 2015/02/26 09:27
字数 596
阅读 118
收藏 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了。


    







© 著作权归作者所有

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

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

问天123
2012/06/29
0
0
常见的移动端H5页面开发遇到的坑和解决办法

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

webmirror
05/02
0
0
基于 C# 开发的手机 APP 资产管理项目 - SmoSEC

继SmoOne之后,又一款用C#开发的APP开源项目正式上线。 这款开源项目名为SmoSec,目前包含资产管理、耗材管理两大类。 并且,我们将会不断迭代,持续增加盘点、标签打印和仓库管理等功能。 ...

smobiler
06/06
0
0
移动端Web系列2 --- 调试

浏览器调试 chrome(V35.0.1916.153) 使用chrome deleloper tool模拟移动设备。注意,部分功能还是与真机有差别,所以还是建议开发完成后在真机中看一下效果。 打开方法 调出开发者工具(M...

见见
08/27
0
0
在Windows笔记本上调试运行在iOS设备上的前端应用

我在每天工作中需要在不同的移动设备上测试我们开发的前端应用是否正常工作,比如iOS设备和Android设备。我用的工作笔记本电脑又是Lenovo的,安装的是Windows操作系统。 有的时候一个开发好的...

JerryWang_SAP
10/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python中sort和sorted函数小结

L.sort(cmp=None, key=None, reverse=False) sorted(iterable, cmp=None, key=None, reverse=False) 这样看,sorted函数只比sort函数多一个iterable参数,其余没什么不同,iterable是一个迭代......

上官夏洛特
28分钟前
1
0
thinkphp 常用SQL执行语句总结

第一条:Db::tablera('vr_panomas')->where(['delete_time'=>0,'id'=>['in',$pids]])->field(['id'=>'id','post_thumb'=>'thumb','post_title'=>'title','post_tags'=>'tags','post_price'=>......

koothon
38分钟前
1
0
支付宝返回状态resultStatus意思

上一篇集成支付宝的时候,会有一些支付宝返回的resultStatus,具体意思是: 9000 订单支付成功 8000 正在处理中 4000 订单支付失败 6001 用户中途取消 6002 网络连接出错 还有memo,意思就是...

RainOrz
42分钟前
1
0
electron webview 页面加载事件顺序

1.did-start-loading 页面开始加载 2.load-commit 主页面文档加载 3.page-title-updated title 4.dom-ready 主页面 dom 加载完成 5.load-commit frame文档加载 6.did-frame-finish-load fram......

dubox
47分钟前
1
0
cron语法格式

Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth Month DayofWeek...

JavaSon712
47分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部