iOS扫一扫,人脸识别的坑

84 阅读1分钟

一、没有打开权限,直接打开导致闪退

判断权限

` AVAuthorizationStatus videoAuthStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

    

    switch (videoAuthStatus) {

        // 已授权

        case AVAuthorizationStatusAuthorized:

        {

            if(permissionGranted){

                permissionGranted(YES);

            }

        }

            break;

        // 未询问用户是否授权

        case AVAuthorizationStatusNotDetermined:

        {

            // 提示用户授权

            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {

                if(permissionGranted){

                    permissionGranted(granted);

                }

            }];

        }

            break;

        // 用户拒绝授权或权限受限

        case AVAuthorizationStatusRestricted:

            

        case AVAuthorizationStatusDenied:

        {

            UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"请在”设置-隐私-相机”选项中,允许访问你的相机" preferredStyle:UIAlertControllerStyleAlert];

            UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];

            UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"设置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

                UIApplication *app = [UIApplication sharedApplication];

                NSURL *settingURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

                    if ([app canOpenURL:settingURL]) {

                        [app openURL:settingURL];

                    }

            }];

            [alertController addAction:cancelAction];

            [alertController addAction:okAction];

            [controller presentViewController:alertController animated:YES completion:nil];

            if(permissionGranted){

                permissionGranted(NO);

            }

        }

            break;

        default:

            break;

    }

`

二、手机坏了拍不了照

` if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"该设备不支持拍照" preferredStyle:UIAlertControllerStyleAlert];

               UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:nil];

               [alertController addAction:cancelAction];

            [controller presentViewController:alertController animated:YES completion:nil];

        if(permissionGranted){

            permissionGranted(NO);

        }

            return;

    } `

三、 不支持扫码或人脸识别

为了统一,我把可支持的类型都丢进去了(最好按需加入)

` NSArray *availableMetadataObjectTypes = metadataOutput.availableMetadataObjectTypes.mutableCopy;

    if(![availableMetadataObjectTypes isKindOfClass:NSArray.class] || availableMetadataObjectTypes.count<1 || ![availableMetadataObjectTypes containsObject:AVMetadataObjectTypeQRCode]){

        [SDRCommonToolManager_SAAS showInfoWithStatus:@"该手机不支持二维码扫描"];

        return;

    }

`

四、你要扫码区返回人脸,你要人脸却放回扫码 判断放回类型

`

  • (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray< __kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection {

    

    // 获取扫一扫结果

    if (metadataObjects && metadataObjects.count > 0) {

        

        [self pauseScanning];

    

        NSString *stringValue = nil;

        //处理扫描结果

        for (AVMetadataMachineReadableCodeObject *metadataObject in metadataObjects) {

            if([metadataObject isKindOfClass:AVMetadataMachineReadableCodeObject.class]){//二维码

                stringValue = metadataObject.stringValue;

            }else if ([metadataObject isKindOfClass:AVMetadataFaceObject.class]){//人脸

                

            }

        }

        

        if(stringValue){

            if (self.manager.scanDelegate) {

                [self.manager.scanDelegate ly_QRCodeScanResultText:stringValue];

            }else{

            if (self.manager.scanDelegate) {

                [self.manager.scanDelegate ly_QRCodeScanResultFail];

            }

        }

           

        } [self popBack];

    }

}

`