투케이2K

202. (ios/swift) [간단 소스] QRCodeReader 라이브러리 사용해 QR 코드 및 Barcode (바코드) 스캔 동시 설정 방법 본문

IOS

202. (ios/swift) [간단 소스] QRCodeReader 라이브러리 사용해 QR 코드 및 Barcode (바코드) 스캔 동시 설정 방법

투케이2K 2022. 9. 19. 17:36

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT

 

 

 

[소스 코드]

    //MARK: - [네이티브 카메라 열기 수행 실시]
    lazy var readerVC: QRCodeReaderViewController = {
        let builder = QRCodeReaderViewControllerBuilder {
            $0.reader = QRCodeReader(metadataObjectTypes: [.qr, .code128], captureDevicePosition: .back)
            
            // [QR 스캔 뷰 컨트롤러 구성 실시]
            $0.showTorchButton        = false
            $0.showSwitchCameraButton = true // 화면 전환 버튼 표시 여부
            $0.showCancelButton       = true // 취소 버튼 표시 여부
            $0.showOverlayView        = true
            $0.rectOfInterest         = CGRect(x: 0.2, y: 0.3, width: 0.6, height: 0.4)
        }
        return QRCodeReaderViewController(builder: builder)
    }()
    func openCamera(){
        print("")
        print("===============================")
        print("[A_Main >> openCamera() :: 카메라 열기 수행 실시]")
        print("===============================")
        print("")
        
        /*
        MARK: [QR 코드 스캔 필요 사항]
        1. info.plist 권한 : Privacy - Camera Usage Description
        2. 라이브러리 설치 git : https://github.com/yannickl/QRCodeReader.swift.git
        3. SPM 패키지 매니저 사용해 설치 시 참고 : branch >> 라이브러리 설치 진행
        4. 필요 import :
           - import AVFoundation
           - import QRCodeReader
        5. 필요 딜리게이트 : QRCodeReaderViewControllerDelegate
        6. 로직 :
          - 카메라 권한 상태 퍼미션 인증 확인
          - 카메라 호출 및 QR 스캔 시작 실시
          - QR 스캔 완료 시 카메라 활성 창 닫기 및 스캔 종료 실시
        */
        
        
        // [SEARCH FAST] : [카메라 호출 수행]
        AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in
            if granted {
                print("")
                print("===============================")
                print("[A_Main > openCamera() :: 카메라 권한 허용 상태]")
                print("===============================")
                print("")
                
                // [카메라 열기 수행 실시]
                DispatchQueue.main.async {
                    // -----------------------------------------
                    // [사진 찍기 카메라 호출]
                    /*let camera = UIImagePickerController()
                    camera.sourceType = .camera
                    self.present(camera, animated: false, completion: nil)*/
                    // -----------------------------------------
                    // [QR 패턴 사용 실시]
                    self.readerVC.delegate = self
                    
                    
                    // [클로저 사용 실시]
                    self.readerVC.completionBlock = { (result: QRCodeReaderResult?) in
                        print("")
                        print("===============================")
                        print("[A_Main >> openCamera() :: 카메라 스캔 결과 확인 실시]")
                        print("result [결과] :: ", result?.value ?? "")
                        print("===============================")
                        print("")
                        
                        // -----------------------------------------
                        
                        // MARK: [스캔 결과 담기]
                        //let scanResult = result?.value ?? ""
                        let scanResult = String(describing: result?.value ?? "")
                        
                        // -----------------------------------------
                        
                        // MARK: [데이터 널 값 여부 체크해 자바스크립트로 전달 실시]
                        if scanResult != nil && scanResult.count>0 && scanResult.trim().equals(_string: "") == false{
                            print("")
                            print("===============================")
                            print("[A_Main > openCamera() :: 카메라 스캔 결과 로직 처리]")
                            print("로 직 :: iosToJs_openCameraResult >> ios >> 자바스크립트 데이터 전송")
                            print("===============================")
                            print("")
                            
                            // [ios >> 자바스크립트 데이터 전송 실시]
                            self.iosToJs_openCameraResult(_send: scanResult)
                        }
                        else {
                            print("")
                            print("===============================")
                            print("[A_Main > openCamera() :: 카메라 스캔 결과 로직 처리]")
                            print("로 직 :: not working (널 데이터)")
                            print("===============================")
                            print("")
                        }
                        
                        // -----------------------------------------
                    }
                    
                    // [readerVC를 모달 양식 시트로 표시]
                    self.readerVC.modalPresentationStyle = .fullScreen
                    //self.readerVC.modalPresentationStyle = .fullScreen
                   
                    self.present(self.readerVC, animated: false, completion: nil)
                    // -----------------------------------------
                }
            } else {
                print("")
                print("===============================")
                print("[A_Main >> openCamera() :: 카메라 권한 거부 상태]")
                print("===============================")
                print("")
                
                // [팝업창 알림 수행 실시]
                self.showAlert(type: 1,
                               tittle: S_FinalData.AL_TITLE,
                               content: S_FinalData.CAMERA_NO_PERMISSION,
                               okBtb: S_FinalData.AL_OK, noBtn: S_FinalData.AL_NO)
            }
        })
    }
    // MARK: [QRCodeReaderViewController 대리자 메소드]
    func reader(_ reader: QRCodeReaderViewController, didScanResult result: QRCodeReaderResult) {
        print("")
        print("===============================")
        print("[A_Main >> reader() :: 카메라 스캔 종료 실시]")
        print("===============================")
        print("")
        reader.stopScanning() // 스캔 중지
        self.dismiss(animated: true, completion: nil) // 카메라 팝업창 없앰
    }
    // MARK: [카메라 전환 버튼 이벤트 확인]
    func reader(_ reader: QRCodeReaderViewController, didSwitchCamera newCaptureDevice: AVCaptureDeviceInput) {
        let cameraName = String(newCaptureDevice.device.localizedName)
        print("")
        print("===============================")
        print("[A_Main >> reader() :: 카메라 전환 버튼 이벤트 확인]")
        print("cameraName : ", cameraName)
        print("===============================")
        print("")
    }
    // MARK: [QR 스캔 종료 실시]
    func readerDidCancel(_ reader: QRCodeReaderViewController) {
        print("")
        print("===============================")
        print("[A_Main >> readerDidCancel() :: 카메라 스캔 취소 실시]")
        print("===============================")
        print("")
        reader.stopScanning() // 스캔 중지
        self.dismiss(animated: true, completion: nil) // 카메라 팝업창 없앰
    }

 
반응형
Comments