这儿每天共享一个 iOS 的新知识,快来重视我吧

前言

之前讲过一些辨认和生成二维码的技术文章,感兴趣能够去看看:

二维码 1: 如何用 swift 生成二维码

二维码 2: 如何用 swift 设置二维码的样式

二维码 3: 如何辨认图片中的二维码内容

但是一向没有讲如何用摄像头扫描二维码,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 的新知识,快来重视我吧

本文同步自微信公众号 “iOS新知”,每天按时共享一个新知识,这儿仅仅同步,想要及时学到就来重视我吧!