본문 바로가기
Xcode/IOS

IOS) QRCode 리더기 만들기

by 후르륵짭짭 2020. 7. 16.
728x90
반응형

안녕하세요 후르륵짭짭 입니다.

이번에는 QRCode Reader를 만들려고 합니다. (아직은 정확히 어떤 기능을 하는지 잘 모르기 때문에 대충적겠습니다 ㅎㅎ )

QRCode 리더기는 영상으로 읽게 됩니다.

 

** 시작 ** 

Info.plist에 가서 아무 + 나 누르고 위와 같이

Privacy - Camera Usage Description

을 추가해준 다음에 viewcontroller로 이동해주세요!

그리고 AVFoundationi 을 임포트 해주세요

import AVFoundation

그러고 나서 

let session = AVCaptureSession()

을 만들어 주세요.

AVCaptureSession은 영상을 담고 처리하는 공간입니다.

 

그리고 ViewDidLoad()에 아래 코드를 적어주세요!

    func basicSetting(){
        
        //사물을 video 방식으로 영상을 촬영하겠다!
        let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
        
        do{
            
            let input = try AVCaptureDeviceInput(device: captureDevice!)
            session.addInput(input)
            
        }catch{
            print("Error")
        }
        
        let output = AVCaptureMetadataOutput()
        session.addOutput(output)
        
        output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
        output.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]
            
        //영상을 담을 공간을 만들어 준다.
        let video  = AVCaptureVideoPreviewLayer(session: session)
        video.frame = CameraView.layer.bounds
        video.videoGravity = AVLayerVideoGravity.resizeAspectFill
        CameraView.layer.addSublayer(video)
        CameraView.bringSubviewToFront(focusImage)
        
        session.startRunning()
    }

하나씩 설명 하도록 하겠습니다.

let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)

AVCaptureDevice는 어떤 처리 방식으로 캡처할 것이냐??? 를 물어보는 것이기에 저희는 video로 해줍니다.

        do{
            
            let input = try AVCaptureDeviceInput(device: captureDevice!)
            session.addInput(input)
            
        }catch{
            print("Error")
        }
        

그리고 이 코드를 적어주세요.

이 코드는  captureDevice에서 영상으로 촬영을 하면 지속적으로 데이터를 넣어주고, 그것을 위에서 만든 영상을 담고 처리하는 공간인 sessioin에 추가해줍니다.

let output = AVCaptureMetadataOutput()
    session.addOutput(output)
        
    output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 
    output.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]

그리고 나서 session에서 우리가 넣어준 input 결과물을 빼주고 이것을 mainThread에서 처리 해줍니다. 

그리고 이 결과물을 QR 코드로 인식 하게 됩니다.

        //영상을 담을 공간을 만들어 준다.
        let video  = AVCaptureVideoPreviewLayer(session: session)
        //카메라의 크기 지정
        video.frame = CameraView.layer.bounds
        //카메라의 비율지정
        video.videoGravity = AVLayerVideoGravity.resizeAspectFill
        //view에 추가하고
        CameraView.layer.addSublayer(video)
        //초점 뷰를 cameraview 위에 추가
        CameraView.bringSubviewToFront(focusImage)

이렇게 해주면 View에 QRCode 카메라가 나올 것 입니다.

 

이제 인식을 하게 되면 이 코드가 호출 될 수 있도록 해줍니다.

    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        
        if metadataObjects.count == 0 {
            return
        }
        
        guard let metaObject = metadataObjects[0] as? AVMetadataMachineReadableCodeObject else {return}
        
        if metaObject.type == AVMetadataObject.ObjectType.qr {
            if let outPutValue = metaObject.stringValue{
                
                //http 형의 코드인지 확인
                if outPutValue.hasPrefix("http://") || outPutValue.hasPrefix("https://")  {
                    
                    UrlLabel.setTitle(outPutValue, for: .normal)
                    zoomIn()
                    //print(url)
                    session.stopRunning()
                    
                }
                
            }
        }
        
    }

meatadataObjects 는 인식한 사물의 수 입니다.

 guard let metaObject = metadataObjects[0] as? AVMetadataMachineReadableCodeObject else {return}

그리고 그  처음으로 인식한 metadataObject가 AVMeatadataMachineRead 할 수 있는지 확인 해줍니다.

        if metaObject.type == AVMetadataObject.ObjectType.qr {
            if let outPutValue = metaObject.stringValue{
                
                if outPutValue.hasPrefix("http://") || outPutValue.hasPrefix("https://")  {
                    
                    UrlLabel.setTitle(outPutValue, for: .normal)
                    zoomIn()
                    //카메라 인식 종류
                    session.stopRunning()
                    
                }
                
            }
        }

그리고 인식한 것이 qr 코드인지 확인 해주면 됩니다!!

참 쉽죠??

사실 거의 코드 복붙해주시면 됩니다!!

 

모두모두 즐코코코 하세요!!!

 

** 참고 사이트 **

levelup.gitconnected.com/how-to-create-a-qrcode-reader-in-swift-1b633d5ac95e

 

How To Create a QR Code Reader in Swift

Create a QRCode reader in a few minutes

levelup.gitconnected.com

www.youtube.com/watch?v=4Zf9dHDJ2yU

 

728x90
반응형

댓글