最近在做一個(gè)swift項(xiàng)目 要寫掃一掃功能 上網(wǎng)找的代碼基本都是3.0以前的 一用全都是錯的
下面把最近的代碼記錄一下, 由于時(shí)間緊迫,只放上功能代碼
func setupScanSession(){
do{
//設(shè)置捕捉設(shè)備
guard let device = AVCaptureDevice.default(for: AVMediaType.video) else {
Tool.confirm(title: "溫馨提示", message: "未得到攝像頭", controller: self)
return
}
//設(shè)置設(shè)備輸入輸出
let input = try AVCaptureDeviceInput(device: device)
let output = AVCaptureMetadataOutput()
output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
//設(shè)置會話
captureSession.canSetSessionPreset(AVCaptureSession.Preset.high)
if captureSession.canAddInput(input){
captureSession.addInput(input)
}
if captureSession.canAddOutput(output){
captureSession.addOutput(output)
}
//設(shè)置掃描類型(二維碼和條形碼)
output.metadataObjectTypes = [
AVMetadataObject.ObjectType.qr,
AVMetadataObject.ObjectType.code39,
AVMetadataObject.ObjectType.code128,
AVMetadataObject.ObjectType.code39Mod43,
AVMetadataObject.ObjectType.ean13,
AVMetadataObject.ObjectType.ean8,
AVMetadataObject.ObjectType.code93]
//預(yù)覽圖層
let scanPreviewLayer = AVCaptureVideoPreviewLayer(session:captureSession)
scanPreviewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
scanPreviewLayer.frame = view.layer.bounds
cameraView.layer.insertSublayer(scanPreviewLayer, at: 0)
//設(shè)置掃描區(qū)域
NotificationCenter.default.addObserver(forName: NSNotification.Name.AVCaptureInputPortFormatDescriptionDidChange, object: nil, queue: nil, using: { (noti) in
output.rectOfInterest = (scanPreviewLayer.metadataOutputRectConverted(fromLayerRect: self.scanPane.frame))
})
//保存會話
captureSession.startRunning()
} catch {
//攝像頭不可用
Tool.confirm(title: "溫馨提示", message: "攝像頭不可用", controller: self)
return
}
}
//開始掃描viewWillAppear中調(diào)用就行
func scannerStart(){
captureSession.startRunning()
}
func scannerStop() {
captureSession.stopRunning()
}
/// 實(shí)現(xiàn)代理方法
//注意這個(gè)代理方法的名字變了!!!不要只用了上面的代碼 發(fā)現(xiàn)不走代理 我就被坑了
extension ScannerViewController: AVCaptureMetadataOutputObjectsDelegate {
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
if metadataObjects.count > 0 {
//? ? ? ? ? ? scanSession?.stopRunning()
scannerStop()
let object = metadataObjects[0]
let string: String = (object as AnyObject).stringValue
if let url = URL(string: string) {
if UIApplication.shared.canOpenURL(url) {
//去打開地址鏈接,這是一個(gè)自定義的webView
let result = WebViewController()
result.url = string;
result.hidesBottomBarWhenPushed = true;
self.navigationController?.pushViewController(result, animated: true)
} else {
//獲取非鏈接結(jié)果
let alertViewController = UIAlertController(title: "掃描結(jié)果", message: (object as AnyObject).stringValue, preferredStyle: .alert)
let actionCancel = UIAlertAction(title: "退出", style: .cancel, handler: { (action) in
_ = self.navigationController?.popViewController(animated: true)
})
let actinSure = UIAlertAction(title: "再次掃描", style: .default, handler: { (action) in
self.scannerStart()
})
alertViewController.addAction(actionCancel)
alertViewController.addAction(actinSure)
self.present(alertViewController, animated: true, completion: nil)
}
}
}
}
}