// // QRCodeScanForChangeDeviceViewController.m // 隐私保护 // // Created by APPLE on 2023/9/19. // #import "QRCodeScanForChangeDeviceViewController.h" #import #import #import "RSATool.h" #import "connectDeviceManager.h" //#import "uploadFileManager.h" #import "nasUploadFileManager.h" //#import "downloadManager.h" #import "nasDownloadFileManager.h" #import "backupsFileManager.h" #import "nasBackupsManager.h" #import #import #import "boxDownloadFileManager.h" @interface QRCodeScanForChangeDeviceViewController () @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 QRCodeScanForChangeDeviceViewController - (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)backBtnPressed { [super backBtnPressed]; if(_isRootVCType){ //发个通知 [[NSNotificationCenter defaultCenter] postNotificationName:scanChangeDeviceBackNotification object:nil]; } } //开始扫描二维码 -(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]; // // [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)]; //打开相册 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.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 isDownType22 = YES; -(void)scanLineDownAndUpFun { [UIView animateWithDuration:0.01 animations:^{ if(isDownType22 && self->_qrCodeScanLine.hw_y <= self->_cyanEdgeImageView.hw_h){ self->_qrCodeScanLine.hw_y += 2; if(self->_cyanEdgeImageView.hw_h - self->_qrCodeScanLine.hw_y <= 5){ isDownType22 = NO; } } else if(!isDownType22 && self->_qrCodeScanLine.hw_y >= 0) { self->_qrCodeScanLine.hw_y -= 2; if(self->_qrCodeScanLine.hw_y <= 5){ isDownType22 = 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 { //[[uploadFileManager shareInstance] suspendUploadFileFun:YES withModel:nil]; [[nasUploadFileManager shareInstance] suspendUploadFileFun:YES withModel:nil]; //[[downloadManager shareInstance] suspendDownloadFileFun:YES withModel:nil]; [[nasDownloadFileManager shareInstance] suspendDownloadFileFun:YES withModel:nil]; //[[backupsFileManager shareInstance] suspendBackupsFileFun]; [[nasBackupsManager shareInstance] suspendBackupsFileFun]; [[boxDownloadFileManager shareInstance] suspendDownloadFileFun:YES withModel:nil]; 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 ){ NSDictionary *deviceDict = [HWDataManager getObjectWithKey:Const_Have_Add_Device]; if (!deviceDict || [[deviceDict allKeys] containsObject:Const_Have_Add_Device_SN]){ NSString *oldStr = deviceDict[Const_Have_Add_Device_SN]; if([oldStr isEqualToString:resStr]){ [[iToast makeText:NSLocalizedString(@"guide_qrcoede_tips_change_same",nil)] show]; //停止扫描 [self.session stopRunning]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [self.session startRunning]; }); return; } } //[[iToast makeText:NSLocalizedString(@"guide_qrcoede_tips_ok",nil)] show]; [_scanLineTimer invalidate]; //停止扫描 [self.session stopRunning]; //移除扫描层layer [self.layer removeFromSuperlayer]; //webrtc方案 [self getScanSnMsgBy:resStr withDict:deviceDict]; //瑞云方案 // [self showNewIndicatorHaveStrWithCanBack:NO canTouch:NO showText:NSLocalizedString(@"guide_qrcoede_tips_ok",nil)]; // [[connectDeviceManager shareInstance] getThridMsgBySN:resStr needReconnect:YES didNetEnd:^(NSInteger didSuc) { // // [self removeNewIndicatorHaveStr]; // // if([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) // { // [[iToast makeText:NSLocalizedString(@"phone_network_fail_Tips",nil)] show]; // [self.navigationController popViewControllerAnimated:YES]; // return; // } // // // if(didSuc == 1){ // // //数据埋点 // [[netWorkManager shareInstance] DataEmbeddingPointBy:2 withEventValue:@"Change_device"]; // // NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:deviceDict]; // [dict setObject:resStr forKey:Const_Have_Add_Device_SN]; // [HWDataManager setObjectWithKey:Const_Have_Add_Device value:dict]; // // BOOL didSetBackWork = [HWDataManager getBoolWithKey:stringKeyAddSn(Const_file_Transfe_didSet_working_background)]; // if(!didSetBackWork){ // [HWDataManager setBoolWithKey:stringKeyAddSn(Const_file_Transfe_didSet_working_background) value:YES]; // [HWDataManager setBoolWithKey:stringKeyAddSn(Const_file_Transfe_working_background) value:YES]; // } // // [webRtcManager shareManager].isChangeBoxType = YES; // [[webRtcManager shareManager] closeLinkWebRtcFun]; // // //尝试修复偶现扫码切换云机 已经扫码到 要输新SN密码 但是云机显示是旧SN的 延时一秒跳转 // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // // //清除原来设置的数据 // ksharedAppDelegate.isWebSockLinkOKAginType = NO; // ksharedAppDelegate.cloudPhoneExtraFileListMod = nil; // ksharedAppDelegate.DisabledFileTransferType = NO; // ksharedAppDelegate.isImageNewFor130 = NO; // ksharedAppDelegate.isNeedShowImageNewType = NO; // ksharedAppDelegate.TvStatusMod = nil; // ksharedAppDelegate.NASMsgMod = nil; // ksharedAppDelegate.isDidShowPwdType = NO; // ksharedAppDelegate.isDidShowPwdType = NO; // ksharedAppDelegate.NASFileByBoxService = nil; // ksharedAppDelegate.NASShareFileService = nil; // HLog(@"isWebSockLinkOKAginType NO") // // [[webRtcManager shareManager] beginToLinkWebRtcFun]; // [[NSNotificationCenter defaultCenter] postNotificationName:GuideOkNotification object:nil]; // }); // // // }else{ // // [webRtcManager shareManager].isChangeBoxType = NO; // //// if(didSuc == 2){ //// [[iToast makeText:NSLocalizedString(@"scan_sn_data_error_tip",nil)] show]; //// } //// else{ //// [[iToast makeText:NSLocalizedString(@"guide_qrcoede_tips_get_SdnID_fail",nil)] show]; //// } // // if(self->_didScanErrorFun){ // self->_didScanErrorFun(didSuc); // } // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // mainBlock(^{ // [self.navigationController popViewControllerAnimated:YES]; // }); // }); // // } // }]; } else{ [[iToast makeText:NSLocalizedString(@"guide_qrcoede_tips_error",nil)] show]; } } #pragma mark 根据扫码得到的SN 重新获取信息 - (void)getScanSnMsgBy:(NSString*)snStr withDict:(NSMutableDictionary*)deviceDict { if([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) { [[iToast makeText:NSLocalizedString(@"phone_network_fail_Tips",nil)] show]; [self.navigationController popViewControllerAnimated:YES]; return; } [self showNewIndicatorHaveStrWithCanBack:NO canTouch:NO showText:NSLocalizedString(@"guide_qrcoede_tips_ok",nil)]; [[netWorkManager shareInstance] getThridMsgBySN:snStr success:^(id _Nonnull responseObject) { [self removeNewIndicatorHaveStr]; DeviceThirdIdModel *model = responseObject; if([model isKindOfClass:[DeviceThirdIdModel class]]){ if(model.status == 0 && model.data){ //数据埋点 [[netWorkManager shareInstance] DataEmbeddingPointBy:2 withEventValue:@"Change_device"]; NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:deviceDict]; [dict setObject:snStr forKey:Const_Have_Add_Device_SN]; [HWDataManager setObjectWithKey:Const_Have_Add_Device value:dict]; BOOL didSetBackWork = [HWDataManager getBoolWithKey:stringKeyAddSn(Const_file_Transfe_didSet_working_background)]; if(!didSetBackWork){ [HWDataManager setBoolWithKey:stringKeyAddSn(Const_file_Transfe_didSet_working_background) value:YES]; [HWDataManager setBoolWithKey:stringKeyAddSn(Const_file_Transfe_working_background) value:YES]; } [webRtcManager shareManager].isChangeBoxType = YES; [webRtcManager shareManager].didSendfristMsg = NO; [[webRtcManager shareManager] closeLinkWebRtcFun]; //尝试修复偶现扫码切换云机 已经扫码到 要输新SN密码 但是云机显示是旧SN的 延时一秒跳转 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ //清除原来设置的数据 ksharedAppDelegate.isWebSockLinkOKAginType = NO; ksharedAppDelegate.cloudPhoneExtraFileListMod = nil; ksharedAppDelegate.DisabledFileTransferType = NO; ksharedAppDelegate.isImageNewFor130 = NO; ksharedAppDelegate.isNeedShowImageNewType = NO; ksharedAppDelegate.TvStatusMod = nil; ksharedAppDelegate.NASMsgMod = nil; ksharedAppDelegate.isDidShowPwdType = NO; ksharedAppDelegate.isDidShowPwdType = NO; ksharedAppDelegate.NASFileByBoxService = nil; ksharedAppDelegate.NASShareFileService = nil; ksharedAppDelegate.DeviceWebRtcMsgMod = nil; HLog(@"isWebSockLinkOKAginType NO") [ksharedAppDelegate resetBoxNetUrlFun]; //[[webRtcManager shareManager] beginToLinkWebRtcFun]; [[NSNotificationCenter defaultCenter] postNotificationName:GuideOkNotification object:nil]; //改走http方案 [[NSNotificationCenter defaultCenter] postNotificationName:getExtraFilesDoneNotification object:nil];/*发送通知*/ }); } else{ NSInteger state = 2; if (model.status == 201 || model.status == 202) { state = model.status; } if(self->_didScanErrorFun){ self->_didScanErrorFun(state); } dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self.navigationController popViewControllerAnimated:YES]; }); } } else{ [webRtcManager shareManager].isChangeBoxType = NO; NSInteger didSuc =2; if(model.status == 201 ||model.status == 202){ didSuc = model.status; } if(self->_didScanErrorFun){ self->_didScanErrorFun(didSuc); } dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ mainBlock(^{ [self.navigationController popViewControllerAnimated:YES]; }); }); } } failure:^(NSError * _Nonnull error) { [self removeNewIndicatorHaveStr]; [webRtcManager shareManager].isChangeBoxType = NO; NSInteger didSuc = 0; if(self->_didScanErrorFun){ self->_didScanErrorFun(didSuc); } dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ mainBlock(^{ [self.navigationController popViewControllerAnimated:YES]; }); }); }]; } //光感传感器代理 -(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 *)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 *)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