这儿每天共享一个 iOS 的新知识,快来重视我吧
前言
之前讲过一些辨认和生成二维码的技术文章,感兴趣能够去看看:
但是一向没有讲如何用摄像头扫描二维码,iOS 其实内置了扫描二维码的支持,运用的是 AVFoundation 这个库,但要想做好一个二维码的辨认,还不是那么容易,你需求创立捕获会话、创立预览层、处理署理回调等。
今天来简略讲讲如安在 iOS 中辨认二维码。
AVCaptureSession
要在 iOS 中辨认二维码,首要用到的是 AVCaptureSession
这个类,首要导入 AVFoundation
,然后我们在操控器中创立一个 session
目标:
importAVFoundation
letsession=AVCaptureSession()
查看摄像头权限
在开端前,你需求查看是否有摄像头权限:
funccheckCameraPermission(){
letauthStatus=AVCaptureDevice.authorizationStatus(for:.video)
switchauthStatus{
case.authorized:
print("已经授权,能够运用摄像头")
case.denied:
print("用户拒绝授权,无法运用摄像头")
case.restricted:
print("用户无法授权,比如家长操控等情况")
case.notDetermined:
print("用户还没有做出选择")
@unknowndefault:
print("其他未知情况")
}
}
配置
查看有权限之后需求做一些配置:
funcconfigs(){
///获取设备
letdiscoverySession=AVCaptureDevice.DiscoverySession(deviceTypes:[.builtInWideAngleCamera],mediaType:.video,position:.back)
///输入和输出
ifletfirstDevice=discoverySession.devices.first,
letvideoInput=try?AVCaptureDeviceInput(device:firstDevice){
letqueue=DispatchQueue.global(qos:.default)
letvideoOutput=AVCaptureMetadataOutput()
videoOutput.setMetadataObjectsDelegate(self,queue:queue)
//增加输入
ifsession.canAddInput(videoInput){
session.addInput(videoInput)
}
//增加输出
ifsession.canAddOutput(videoOutput){
session.addOutput(videoOutput)
}
///设置扫描类型
videoOutput.metadataObjectTypes=[.qr,.code39,.code128,.code39Mod43,.ean13,.ean8,.code93]
}else{
print("犯错")
}
}
增加预览
预览就是把摄像头拍到的内容显示出来,我们这儿直接全屏显示:
funcaddPreview(){
letpreviewLayer=AVCaptureVideoPreviewLayer(session:session)
previewLayer.frame=view.layer.bounds
previewLayer.videoGravity=.resizeAspectFill
view.layer.addSublayer(previewLayer)
}
开端扫描
之后就能够调用开端扫描的方法了:
session.startRunning()
扫描成果需求实现 AVCaptureMetadataOutputObjectsDelegate
这个署理:
extensionViewController:AVCaptureMetadataOutputObjectsDelegate{
///扫描成果回调
funcmetadataOutput(_output:AVCaptureMetadataOutput,didOutputmetadataObjects:[AVMetadataObject],fromconnection:AVCaptureConnection){
guard!metadataObjects.isEmptyelse{
print("扫描成果为空")
return
}
forobjectinmetadataObjects{
ifletobj=objectas?AVMetadataMachineReadableCodeObject,
letresult=obj.stringValue{
print("扫描成果为:(result)")
}
}
//中止扫描
session.stopRunning()
//扫到之后的操作。。。
}
}
一般来说,扫描到内容之后需求中止 Session 的扫描,并对扫描成果进行处理。
这儿每天共享一个 iOS 的新知识,快来重视我吧