|
@@ -0,0 +1,451 @@
|
|
|
+//
|
|
|
+// QRCodeScanViewController.m
|
|
|
+// 隐私保护
|
|
|
+//
|
|
|
+// Created by APPLE on 2023/9/19.
|
|
|
+//
|
|
|
+
|
|
|
+#import "ScanToLoginViewController.h"
|
|
|
+#import <AVFoundation/AVFoundation.h>
|
|
|
+#import <ImageIO/ImageIO.h>
|
|
|
+#import "RSATool.h"
|
|
|
+#import <TZImageManager.h>
|
|
|
+#import <TZImagePickerController.h>
|
|
|
+
|
|
|
+@interface ScanToLoginViewController ()<AVCaptureMetadataOutputObjectsDelegate,AVCaptureVideoDataOutputSampleBufferDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate,TZImagePickerControllerDelegate>
|
|
|
+
|
|
|
+@property(nonatomic,strong)AVCaptureVideoPreviewLayer *layer;
|
|
|
+
|
|
|
+//捕捉会话
|
|
|
+@property(nonatomic,strong)AVCaptureSession *session;
|
|
|
+
|
|
|
+//辅助区域框
|
|
|
+@property(nonatomic,strong)UIImageView * cyanEdgeImageView;
|
|
|
+@property(nonatomic,strong)UIImageView * qrCodeScanLine;
|
|
|
+@property(nonatomic,strong)NSTimer * scanLineTimer;
|
|
|
+
|
|
|
+////打开灯光btn,默认为hidden
|
|
|
+//
|
|
|
+//@property(nonatomic,strong)UIButton * lightBtn;
|
|
|
+//
|
|
|
+////获取相册图片进行扫描
|
|
|
+//
|
|
|
+//@property(nonatomic,strong)UIButton * photoBtn;
|
|
|
+@end
|
|
|
+
|
|
|
+@implementation ScanToLoginViewController
|
|
|
+
|
|
|
+- (void)viewDidLoad {
|
|
|
+ [super viewDidLoad];
|
|
|
+ // Do any additional setup after loading the view.
|
|
|
+
|
|
|
+ [self.navigationBar setHidden:YES];
|
|
|
+ [self.toolBar setHidden:YES];
|
|
|
+
|
|
|
+ AVAuthorizationStatus authStatus =[AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
|
|
|
+ //判断摄像头状态是否可用
|
|
|
+ if(authStatus==AVAuthorizationStatusAuthorized){
|
|
|
+ [self startScan];
|
|
|
+ }else{
|
|
|
+ NSLog(@"未开启相机权限,请前往设置中开启");
|
|
|
+ [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
|
|
|
+ if (granted){
|
|
|
+ mainBlock(^{
|
|
|
+ [self startScan];
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }];
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+-(void)viewWillDisappear:(BOOL)animated
|
|
|
+{
|
|
|
+ [super viewWillDisappear:animated];
|
|
|
+ if(_scanLineTimer)[_scanLineTimer invalidate];
|
|
|
+}
|
|
|
+
|
|
|
+//开始扫描二维码
|
|
|
+
|
|
|
+-(void)startScan{
|
|
|
+ //1.创建捕捉会话,AVCaptureSession是第一个要被创建的对象,所有的操作都要基于这一个session
|
|
|
+ self.session = [[AVCaptureSession alloc]init];
|
|
|
+ AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
|
|
|
+
|
|
|
+AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
|
|
|
+
|
|
|
+ [self.session addInput:input];
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //3.添加输出数据(示例对象-->类对象-->元类对象-->根元类对象)
|
|
|
+
|
|
|
+ /*输入的类是AVCaptureInput,那么输出的类相应的就应该是AVCaptureOutput。
|
|
|
+
|
|
|
+ 输出不需要和设备挂钩,因为一般情况下,我们的输出要么是音频或视频文件,要么是一些其他的数据,像二维码扫描一般是字符串类型。
|
|
|
+
|
|
|
+ 所以创建AVCaptureOutput实例就不需要AVCaptureDevice对象。
|
|
|
+
|
|
|
+ AVCaptureOutput也同样是一个抽象类,同样要使用其子类,在这里我们扫描二维码,
|
|
|
+
|
|
|
+ 使用的是AVCaptureMetadataOutput,设置代码如下所示*/
|
|
|
+
|
|
|
+
|
|
|
+ AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
|
|
|
+ [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
|
|
|
+
|
|
|
+ //设置能扫描的区域,这里注意,CGRectMake的x,y和width,height的值是互换位置
|
|
|
+
|
|
|
+ output.rectOfInterest=CGRectMake(250/self.view.frame.size.height, 100/self.view.frame.size.width, (self.view.frame.size.width-200)/self.view.frame.size.width, (self.view.frame.size.width-200)/self.view.frame.size.width);
|
|
|
+
|
|
|
+ [self.session addOutput:output];
|
|
|
+//设置输入元数据的类型(类型是二维码,条形码数据,注意,这个一定要写在添加到session后面,不然要崩溃,如果只需要扫描二维码只需要AVMetadataObjectTypeQRCode,如果还需要扫描条形码,那么全部添加上)
|
|
|
+ [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode,
|
|
|
+ AVMetadataObjectTypeEAN8Code,
|
|
|
+ AVMetadataObjectTypeEAN13Code,
|
|
|
+ AVMetadataObjectTypeCode39Code,
|
|
|
+ AVMetadataObjectTypeCode39Mod43Code,
|
|
|
+ AVMetadataObjectTypeCode93Code,
|
|
|
+ AVMetadataObjectTypeCode128Code,
|
|
|
+ AVMetadataObjectTypePDF417Code,
|
|
|
+ AVMetadataObjectTypeAztecCode,
|
|
|
+ AVMetadataObjectTypeUPCECode,
|
|
|
+ AVMetadataObjectTypeInterleaved2of5Code,
|
|
|
+ AVMetadataObjectTypeITF14Code,
|
|
|
+ AVMetadataObjectTypeDataMatrixCode,
|
|
|
+ ]];
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //4.添加扫描图层
|
|
|
+
|
|
|
+ self.layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
|
|
|
+
|
|
|
+ self.layer.videoGravity=AVLayerVideoGravityResizeAspectFill;
|
|
|
+
|
|
|
+ self.layer.frame = self.view.bounds;
|
|
|
+
|
|
|
+ [self.view.layer addSublayer:self.layer];
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //5.创建view,通过layer层进行设置边框宽度和颜色,用来辅助展示扫描的区域
|
|
|
+
|
|
|
+ _cyanEdgeImageView=[[UIImageView alloc] initWithFrame:CGRectMake(100, 250, self.view.frame.size.width-200, self.view.frame.size.width-200)];
|
|
|
+
|
|
|
+// _cyanEdgeImageView.layer.borderWidth=2;
|
|
|
+//
|
|
|
+// _cyanEdgeImageView.layer.borderColor =[UIColor cyanColor].CGColor;
|
|
|
+
|
|
|
+ _cyanEdgeImageView.image = [UIImage imageNamed:@"qrCode_scan_bg"];
|
|
|
+ [self.view addSubview:_cyanEdgeImageView];
|
|
|
+
|
|
|
+ _qrCodeScanLine=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width-200, 1)];
|
|
|
+
|
|
|
+ _qrCodeScanLine.image = [UIImage imageNamed:@"qrCode_scan_line"];
|
|
|
+ [_cyanEdgeImageView addSubview:_qrCodeScanLine];
|
|
|
+
|
|
|
+ _scanLineTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(scanLineDownAndUpFun) userInfo:nil repeats:YES];
|
|
|
+
|
|
|
+ UILabel *tipLib = [[UILabel alloc] initWithFrame:CGRectMake(20, _cyanEdgeImageView.hw_max_y + 15, SCREEN_W - 40, 20)];
|
|
|
+ tipLib.text = NSLocalizedString(@"guide_qrcoede_tips_please",nil);
|
|
|
+ tipLib.font = [UIFont systemFontOfSize:14.0];
|
|
|
+ tipLib.textAlignment = NSTextAlignmentCenter;
|
|
|
+ tipLib.textColor = [UIColor whiteColor];
|
|
|
+ [self.view addSubview:tipLib];
|
|
|
+
|
|
|
+ //6.创建检测光感源
|
|
|
+
|
|
|
+ AVCaptureVideoDataOutput *guangOutPut = [[AVCaptureVideoDataOutput alloc] init];
|
|
|
+
|
|
|
+ [guangOutPut setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
|
|
|
+
|
|
|
+ //设置为高质量采集率
|
|
|
+
|
|
|
+ [self.session setSessionPreset:AVCaptureSessionPresetHigh];
|
|
|
+
|
|
|
+ //把光感源添加到会话
|
|
|
+ [self.session addOutput:guangOutPut];
|
|
|
+
|
|
|
+// self.lightBtn=[[UIButton alloc]initWithFrame:CGRectMake(150, cyanView.frame.origin.y+cyanView.frame.size.height+100, self.view.frame.size.width-300, self.view.frame.size.width-300)];
|
|
|
+//
|
|
|
+// self.lightBtn.backgroundColor=[UIColor grayColor];
|
|
|
+//
|
|
|
+// [self.lightBtn addTarget:self action:@selector(lightBtnClick:) forControlEvents:UIControlEventTouchUpInside];
|
|
|
+//
|
|
|
+
|
|
|
+ //打开相册
|
|
|
+ UIButton *openAlbunBut = [[UIButton alloc] init];
|
|
|
+ [openAlbunBut setTitle:NSLocalizedString(@"guide_qrcoede_open_album",nil) forState:UIControlStateNormal];
|
|
|
+ [openAlbunBut setTitleColor:[UIColor hwColor:@"#3B7FFF" alpha:1.0] forState:UIControlStateNormal];
|
|
|
+ openAlbunBut.titleLabel.font = [UIFont systemFontOfSize:14.0];
|
|
|
+ [openAlbunBut addTarget:self action:@selector(photoBtnClick:) forControlEvents:UIControlEventTouchUpInside];
|
|
|
+ openAlbunBut.backgroundColor = [UIColor hwColor:@"#FFFFFF" alpha:0.2];
|
|
|
+ [self.view addSubview:openAlbunBut];
|
|
|
+ openAlbunBut.layer.cornerRadius = 24;
|
|
|
+ openAlbunBut.layer.masksToBounds = YES;
|
|
|
+
|
|
|
+ [openAlbunBut mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
|
+ make.width.mas_equalTo(140);
|
|
|
+ make.height.mas_equalTo(48);
|
|
|
+ make.centerX.mas_equalTo(0);
|
|
|
+ make.bottom.mas_equalTo(-80);
|
|
|
+ }];
|
|
|
+
|
|
|
+
|
|
|
+// [self.view addSubview:self.lightBtn];
|
|
|
+// self.photoBtn=[[UIButton alloc]initWithFrame:CGRectMake(100, self.lightBtn.frame.origin.y+self.lightBtn.frame.size.height+50, self.view.frame.size.width-200, 50)];
|
|
|
+// [self.photoBtn setTitle:@"相册" forState:UIControlStateNormal];
|
|
|
+// [self.photoBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
|
|
|
+// self.photoBtn.backgroundColor=[UIColor orangeColor];
|
|
|
+// [self.photoBtn addTarget:self action:@selector(photoBtnClick:) forControlEvents:UIControlEventTouchUpInside];
|
|
|
+// [self.view addSubview:self.photoBtn];
|
|
|
+ //9.开始扫描
|
|
|
+ [self.session startRunning];
|
|
|
+
|
|
|
+ //添加返回键
|
|
|
+ CGFloat btn_w_h = 40;
|
|
|
+ CGFloat btn_show = 28;
|
|
|
+ UIButton *backBtn = [[UIButton alloc] init];
|
|
|
+ [self.view addSubview:backBtn];
|
|
|
+ [backBtn mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
|
+ make.top.mas_equalTo(H_STATE_BAR + (64.f - btn_w_h)/2.f);
|
|
|
+ make.left.mas_equalTo(10);
|
|
|
+ make.width.mas_equalTo(btn_w_h);
|
|
|
+ make.height.mas_equalTo(btn_w_h);
|
|
|
+ }];
|
|
|
+ [backBtn setImage:[UIImage imageNamed:@"icon_base_back"] forState:(UIControlStateNormal)];
|
|
|
+ [backBtn setImageEdgeInsets:(UIEdgeInsetsMake((btn_w_h - btn_show)/2.f, (btn_w_h - btn_show)/2.f, (btn_w_h - btn_show)/2.f, (btn_w_h - btn_show)/2.f))];
|
|
|
+ [backBtn addTarget:self
|
|
|
+ action:@selector(backBtnPressed)
|
|
|
+ forControlEvents:(UIControlEventTouchUpInside)];
|
|
|
+}
|
|
|
+
|
|
|
+#pragma mark timer 处理线上下移动
|
|
|
+bool isScantoLoginDownType = YES;
|
|
|
+-(void)scanLineDownAndUpFun
|
|
|
+{
|
|
|
+ [UIView animateWithDuration:0.01 animations:^{
|
|
|
+
|
|
|
+ if(isScantoLoginDownType && self->_qrCodeScanLine.hw_y <= self->_cyanEdgeImageView.hw_h){
|
|
|
+ self->_qrCodeScanLine.hw_y += 2;
|
|
|
+
|
|
|
+ if(self->_cyanEdgeImageView.hw_h - self->_qrCodeScanLine.hw_y <= 5){
|
|
|
+ isScantoLoginDownType = NO;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(!isScantoLoginDownType && self->_qrCodeScanLine.hw_y >= 0)
|
|
|
+ {
|
|
|
+ self->_qrCodeScanLine.hw_y -= 2;
|
|
|
+
|
|
|
+ if(self->_qrCodeScanLine.hw_y <= 5){
|
|
|
+ isScantoLoginDownType = YES;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }];
|
|
|
+}
|
|
|
+
|
|
|
+//实现扫描的回调代理方法
|
|
|
+
|
|
|
+- (void)captureOutput:(AVCaptureOutput*)captureOutput didOutputMetadataObjects:(NSArray*)metadataObjects fromConnection:(AVCaptureConnection*)connection{
|
|
|
+
|
|
|
+//如果数组metadataObjects中有数据,metadataObjects是个数组类型
|
|
|
+
|
|
|
+ if(metadataObjects.count>0) {
|
|
|
+
|
|
|
+ AVMetadataMachineReadableCodeObject*object = [metadataObjects lastObject];
|
|
|
+
|
|
|
+ NSLog(@"%@",object.stringValue);
|
|
|
+
|
|
|
+ /*扫描到有用信息时取消扫描*/
|
|
|
+ NSString *resStr = object.stringValue;//RK3908P1V62112465
|
|
|
+
|
|
|
+ [self handleScanCodeResultFun:resStr];
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ [[iToast makeText:NSLocalizedString(@"guide_qrcoede_tips_error",nil)] show];
|
|
|
+ NSLog(@"没有扫描到数据");
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#pragma mark 处理扫码出来的数据
|
|
|
+- (void)handleScanCodeResultFun:(NSString*)resultStr
|
|
|
+{
|
|
|
+ NSString * resStr = resultStr;
|
|
|
+
|
|
|
+ if(resStr.length > 22)
|
|
|
+ {
|
|
|
+ NSString*desStr = [RSATool AES128Decrypt:resStr key:AESCODEKEEYY];
|
|
|
+
|
|
|
+ if(desStr){//能解码
|
|
|
+ resStr = desStr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //Ch0IKJCY9lOgokjfPBFE1cowdC1+tj7ywB2pZgSzjhc=
|
|
|
+ //sgl5OzDoVjY5SmGuL50/EnQ4n6Kw+DzRiE1oUjq7yAM=
|
|
|
+
|
|
|
+ if (([resStr containsString:@"RK"] && (resStr.length == @"RK3908P1V62112465".length))
|
|
|
+ || resStr.length == @"0333933700223250017273".length
|
|
|
+ ){
|
|
|
+
|
|
|
+ [_scanLineTimer invalidate];
|
|
|
+
|
|
|
+ //停止扫描
|
|
|
+ [self.session stopRunning];
|
|
|
+
|
|
|
+ //移除扫描层layer
|
|
|
+ [self.layer removeFromSuperlayer];
|
|
|
+
|
|
|
+ if(_didScanSNFun){
|
|
|
+ _didScanSNFun(resStr);
|
|
|
+ }
|
|
|
+
|
|
|
+ [self.navigationController popViewControllerAnimated:YES];
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ [[iToast makeText:NSLocalizedString(@"guide_qrcoede_tips_error",nil)] show];
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+//光感传感器代理
|
|
|
+-(void)captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection{
|
|
|
+
|
|
|
+ //获取光线的值
|
|
|
+
|
|
|
+ CFDictionaryRef metadataDict = CMCopyDictionaryOfAttachments(NULL,sampleBuffer, kCMAttachmentMode_ShouldPropagate);
|
|
|
+
|
|
|
+ NSDictionary *metadata = [[NSMutableDictionary alloc] initWithDictionary:(__bridge NSDictionary*)metadataDict];
|
|
|
+
|
|
|
+ CFRelease(metadataDict);
|
|
|
+
|
|
|
+ NSDictionary *exifMetadata = [[metadata objectForKey:(NSString *)kCGImagePropertyExifDictionary] mutableCopy];
|
|
|
+
|
|
|
+ float brightnessValue = [[exifMetadata objectForKey:(NSString*)kCGImagePropertyExifBrightnessValue]floatValue];
|
|
|
+
|
|
|
+ NSLog(@"%f",brightnessValue);
|
|
|
+
|
|
|
+
|
|
|
+ // 根据brightnessValue的值来打开和关闭闪光灯,一般值小于0就需要打开,大于0就关闭
|
|
|
+
|
|
|
+// if((brightnessValue <0)) {//显示闪光灯
|
|
|
+// self.lightBtn.hidden=NO;
|
|
|
+// }else if((brightnessValue >0)) {//隐藏闪光灯
|
|
|
+// self.lightBtn.hidden=YES;
|
|
|
+// }
|
|
|
+}
|
|
|
+
|
|
|
+////闪光灯按钮点击方法
|
|
|
+//
|
|
|
+//-(void)lightBtnClick:(UIButton*)sender{
|
|
|
+// //判断当前设备是否有闪光灯
|
|
|
+//
|
|
|
+// AVCaptureDevice * device=[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
|
|
|
+//
|
|
|
+// BOOL result=[device hasTorch];
|
|
|
+//
|
|
|
+// if(result==YES){
|
|
|
+// if(self.lightBtn.isSelected==NO){
|
|
|
+// self.lightBtn.selected=YES;
|
|
|
+// self.lightBtn.backgroundColor=[UIColor greenColor];
|
|
|
+// [device lockForConfiguration:nil];
|
|
|
+// [device setTorchMode: AVCaptureTorchModeOn];//开
|
|
|
+// [device unlockForConfiguration];
|
|
|
+// }else if(self.lightBtn.isSelected==YES){
|
|
|
+// self.lightBtn.selected=NO;
|
|
|
+// self.lightBtn.backgroundColor=[UIColor grayColor];
|
|
|
+// [device lockForConfiguration:nil];
|
|
|
+// [device setTorchMode: AVCaptureTorchModeOff];//关
|
|
|
+// [device unlockForConfiguration];
|
|
|
+// }
|
|
|
+// }else{
|
|
|
+// NSLog(@"当前设备闪光灯不可用");
|
|
|
+// }
|
|
|
+//}
|
|
|
+//
|
|
|
+////获取相册图片btn点击方法
|
|
|
+
|
|
|
+-(void)photoBtnClick:(UIButton*)sender{
|
|
|
+// UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
|
|
|
+// imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
|
|
|
+// // imagePicker.allowsEditing = YES;
|
|
|
+// imagePicker.delegate=self;
|
|
|
+// [self.navigationController presentViewController:imagePicker animated:YES completion:nil];
|
|
|
+
|
|
|
+ [self photoClickFun];
|
|
|
+}
|
|
|
+
|
|
|
+- (void)photoClickFun
|
|
|
+{
|
|
|
+ TZImagePickerController *imagePicker = [[TZImagePickerController alloc] initWithMaxImagesCount:1 delegate:self];
|
|
|
+
|
|
|
+ imagePicker.allowPickingVideo=NO;
|
|
|
+ //imagePicker.isStatusBarDefault=YES;
|
|
|
+ imagePicker.allowTakePicture=NO;
|
|
|
+ imagePicker.allowPreview = NO;
|
|
|
+ // 4. 照片排列按修改时间升序
|
|
|
+ imagePicker.sortAscendingByModificationDate = YES;
|
|
|
+ [self presentViewController:imagePicker animated:YES completion:nil];
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray<UIImage *> *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto
|
|
|
+{
|
|
|
+ if(photos && photos.count >= 1){
|
|
|
+ [self detectImageFunBy:photos.firstObject];
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ [[iToast makeText:NSLocalizedString(@"guide_qrcoede_tips_error",nil)] show];
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//UIImagePickerControllerDelegate选择图片的回调
|
|
|
+
|
|
|
+-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info {
|
|
|
+ //把UIimage类型转换成CIimage类型
|
|
|
+ UIImage *pickedImage = info[UIImagePickerControllerEditedImage] ?: info[UIImagePickerControllerOriginalImage];
|
|
|
+
|
|
|
+ [picker dismissViewControllerAnimated:YES completion:^{
|
|
|
+
|
|
|
+ }];
|
|
|
+
|
|
|
+ [self detectImageFunBy:pickedImage];
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+#pragma mark 解析Uiimage
|
|
|
+- (void)detectImageFunBy:(UIImage*)pickedImage
|
|
|
+{
|
|
|
+ CIImage*detectImage = [CIImage imageWithData:UIImagePNGRepresentation(pickedImage)];
|
|
|
+ //解析扫描二维码结果字符串
|
|
|
+ CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyLow}];
|
|
|
+ //CIQRCodeFeature*feature = (CIQRCodeFeature*)[detector featuresInImage:detectImage options:nil].firstObject;
|
|
|
+ NSArray *messageStringArr = (CIQRCodeFeature*)[detector featuresInImage:detectImage options:nil];
|
|
|
+
|
|
|
+ //排除掉 http的
|
|
|
+ __block NSString *curQRCodeStr = nil;
|
|
|
+ for(CIQRCodeFeature*feature in messageStringArr){
|
|
|
+
|
|
|
+ if([feature.messageString rangeOfString:@"http"].location == NSNotFound){
|
|
|
+ curQRCodeStr = feature.messageString;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(curQRCodeStr) {
|
|
|
+ NSLog(@"=================二维码结果为%@",curQRCodeStr);
|
|
|
+ [self handleScanCodeResultFun:curQRCodeStr];
|
|
|
+
|
|
|
+ }else{
|
|
|
+ [[iToast makeText:NSLocalizedString(@"guide_qrcoede_tips_error",nil)] show];
|
|
|
+ NSLog(@"没有扫描到数据");
|
|
|
+ }
|
|
|
+
|
|
|
+// //停止会话对象扫描
|
|
|
+// [self.session stopRunning];
|
|
|
+// //移除扫描层layer
|
|
|
+// [self.layer removeFromSuperlayer];
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+@end
|