一、识别身份证
@interface IDCardScanViewController () <AVCaptureMetadataOutputObjectsDelegate>
@property (nonatomic, strong) AVCaptureSession *captureSession;
@end
@implementation IDCardScanViewController
- (void)viewDidLoad {
super viewDidLoad\];
// 创建视频预览层
AVCaptureVideoPreviewLayer \*previewLayer = \[\[AVCaptureVideoPreviewLayer alloc\] initWithSession:self.captureSession\];
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
previewLayer.frame = self.scanView.bounds;
\[self.scanView.layer addSublayer:previewLayer\];
// 创建数据输出
AVCaptureMetadataOutput \*output = \[\[AVCaptureMetadataOutput alloc\] init\];
\[self.captureSession addOutput:output\];
\[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()\];
// 设置扫描支持的码类型
if (\[output.availableMetadataObjectTypes containsObject:AVMetadataObjectTypeIDCard\]) {
output.metadataObjectTypes = @\[AVMetadataObjectTypeIDCard\];
}
// 启动扫描
\[self.captureSession startRunning\];
}
- (AVCaptureSession \*)captureSession {
if (!_captureSession) {
_captureSession = \[\[AVCaptureSession alloc\] init\];
// 配置摄像头输入
AVCaptureDevice \*device = \[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo\];
AVCaptureDeviceInput \*input = \[AVCaptureDeviceInput deviceInputWithDevice:device error:nil\];
\[_captureSession addInput:input\];
}
return _captureSession;
}
- (void)captureOutput:(AVCaptureOutput \*)captureOutput didOutputMetadataObjects:(NSArray\<__kindof AVMetadataObject \*\> \*)metadataObjects fromConnection:(AVCaptureConnection \*)connection {
for (AVMetadataObject \*metadata in metadataObjects) {
if (\[metadata isKindOfClass:\[AVMetadataMachineReadableCodeObject class\]\]) {
AVMetadataMachineReadableCodeObject \*code = (AVMetadataMachineReadableCodeObject \*)metadata;
if (\[code.type isEqualToString:AVMetadataObjectTypeIDCard\]) {
NSString \*result = code.stringValue;
// 对扫描结果进行处理
NSLog(@"扫描结果:%@", result);
}
}
}
}
下面的方法需要iOS13以上才能支持
#import \