QR 코드를 스캔하고 해당 데이터를 처리하는 기능은 모바일 앱 개발에서 자주 사용됩니다. Swift 언어를 기반으로 하여 PromiseKit를 사용하여 QR 코드 스캔 기능을 구현하는 방법에 대해 알아보겠습니다.
1. PromiseKit 설치
PromiseKit는 비동기 작업을 처리하기 위한 라이브러리로, Swift에서 사용할 수 있습니다. CocoaPods를 사용하여 설치할 수 있습니다. Podfile
에 다음과 같이 추가합니다.
pod 'PromiseKit'
그리고 터미널에서 pod install
명령어로 설치합니다.
2. QR 코드 스캔 기능 구현하기
QR 코드 스캔을 위해서는 AVFoundation
프레임워크를 사용합니다. 먼저, Info.plist
파일에 카메라 사용 권한을 추가해야 합니다. 다음 키-값을 추가하세요.
- Privacy - Camera Usage Description: “카메라를 사용하여 QR 코드를 스캔합니다.”
스캔을 위한 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 코드 스캔 기능을 추가해보세요!
참고 자료
- PromiseKit GitHub
- AVCaptureMetadataOutput - Apple Developer Documentation
- AVCaptureDevice - Apple Developer Documentation
- AVCaptureVideoPreviewLayer - Apple Developer Documentation