[swift] Swift PromiseKit와 QR 코드 스캔 기능 구현 방법

QR 코드를 스캔하고 해당 데이터를 처리하는 기능은 모바일 앱 개발에서 자주 사용됩니다. Swift 언어를 기반으로 하여 PromiseKit를 사용하여 QR 코드 스캔 기능을 구현하는 방법에 대해 알아보겠습니다.

1. PromiseKit 설치

PromiseKit는 비동기 작업을 처리하기 위한 라이브러리로, Swift에서 사용할 수 있습니다. CocoaPods를 사용하여 설치할 수 있습니다. Podfile에 다음과 같이 추가합니다.

pod 'PromiseKit'

그리고 터미널에서 pod install 명령어로 설치합니다.

2. QR 코드 스캔 기능 구현하기

QR 코드 스캔을 위해서는 AVFoundation 프레임워크를 사용합니다. 먼저, Info.plist 파일에 카메라 사용 권한을 추가해야 합니다. 다음 키-값을 추가하세요.

스캔을 위한 QRCodeScanner 클래스를 작성해보겠습니다.

import AVFoundation
import PromiseKit

class QRCodeScanner: NSObject, AVCaptureMetadataOutputObjectsDelegate {
    
    private var captureSession: AVCaptureSession?
    
    func startScan() -> Promise<String> {
        return Promise { seal in
            // 카메라 장치 생성
            guard let captureDevice = AVCaptureDevice.default(for: .video) else {
                seal.reject(NSError(domain: "AVCaptureDevice", code: 0, userInfo: nil))
                return
            }

            // 입력 장치
            guard let input = try? AVCaptureDeviceInput(device: captureDevice) else {
                seal.reject(NSError(domain: "AVCaptureInput", code: 0, userInfo: nil))
                return
            }

            // 캡처 세션 생성 및 설정
            let captureSession = AVCaptureSession()
            self.captureSession = captureSession
            captureSession.addInput(input)
            
            // 출력 설정
            let output = AVCaptureMetadataOutput()
            captureSession.addOutput(output)
            output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
            output.metadataObjectTypes = [.qr]
            
            // 미리보기 뷰 설정
            let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
            previewLayer.videoGravity = .resizeAspectFill
            
            // 현재 뷰에 미리보기 뷰 추가
            // 예시로는 View Controller의 view에 추가하겠습니다.
            // 실제로는 해당하는 뷰에 맞게 추가하세요.
            if let previewView = self.previewView {
                previewView.layer.addSublayer(previewLayer)
            }
            
            // 스캔 시작
            captureSession.startRunning()
        }
    }
    
    // QR 코드 스캔 결과 처리
    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        guard let metadataObj = metadataObjects.first as? AVMetadataMachineReadableCodeObject,
              let qrCodeString = metadataObj.stringValue else {
            return
        }
        
        // QR 코드 결과 처리
        // 예시로는 결과를 콘솔에 출력하겠습니다.
        // 실제로는 해당하는 로직을 추가합니다.
        print(qrCodeString)
        
        // 스캔 중지
        captureSession?.stopRunning()
    }
}

위 코드는 AVCaptureSession을 사용하여 카메라 입력을 받고, AVCaptureMetadataOutput을 사용하여 QR 코드 스캔 결과를 처리합니다. AVCaptureMetadataOutputObjectsDelegate를 구현하여 스캔 결과를 받을 수 있습니다.

3. QR 코드 스캔 실행하기

QRCodeScanner 클래스를 사용하여 QR 코드 스캔을 실행해보겠습니다.

let scanner = QRCodeScanner()

scanner.startScan()
    .done { qrCodeString in
        // 성공적으로 QR 코드를 스캔한 경우 처리
        print("QR 코드 스캔 결과: \(qrCodeString)")
    }
    .catch { error in
        // QR 코드 스캔 중 에러 발생 시 처리
        print("QR 코드 스캔 에러: \(error)")
    }

위 코드에서 startScan 메서드는 Promise<String>을 반환합니다. 스캔 성공 시 done 클로저에서 QR 코드 스트링을 처리하고, 에러 발생 시 catch 클로저에서 에러를 처리합니다.

위와 같이 사용하면 PromiseKit와 QR 코드 스캔 기능을 Swift로 구현할 수 있습니다. 이를 활용하여 앱에 QR 코드 스캔 기능을 추가해보세요!

참고 자료