博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 扫一扫功能开发
阅读量:4066 次
发布时间:2019-05-25

本文共 3753 字,大约阅读时间需要 12 分钟。

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄

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

那么第三方的二维码扫出来后,会跳向这个网址。

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

这段代码是基于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;}
谢谢!!!

转载地址:http://yptji.baihongyu.com/

你可能感兴趣的文章
IBM WebSphere Commerce Developer Business Edition
查看>>
IBM Tivolli Composite Application Manager / IBM ITCAM
查看>>
IBM WebSphere Commerce Analyzer
查看>>
Unix + OS IBM Aix System Director
查看>>
Unix + OS IBM Aix FTP / wu-ftp / proftp
查看>>
framework apache commons
查看>>
my read work
查看>>
blancerServer IBM WebSphere Edge Server 6.1
查看>>
db db2 base / instance database tablespace container
查看>>
my read _job
查看>>
hd disk / disk raid / disk io / iops / iostat / iowait / iotop / iometer
查看>>
project ASP.NET
查看>>
Linux + OS SUSE 11 / OpenSUSE 11
查看>>
net monitor nagios / cacti / solarwinds / tivoli netcool / Vyatta
查看>>
monitorServer IBM Tivoli Enterprise Monitor Server
查看>>
hd Aruba wifi / honor
查看>>
db db2 v9.7 / 9.8
查看>>
JAVA JDK / JRE / SDK IBM & Oracle
查看>>
db db2 v8.2
查看>>
my games / BF3 / GTA5 / NFS18 / sanguowushuang6 / RA2 / KOF97 / FIFA
查看>>