[swift] PMAlertController 알림창 스캔기능 추가하기

안녕하세요! 이번에는 PMAlertController를 사용하여 알림창에 스캔 기능을 추가하는 방법에 대해 알아보겠습니다.

PMAlertController란?

PMAlertController는 UIKit의 UIAlertController를 대체하는 사용하기 쉬운 사용자 정의 알림창 라이브러리입니다. 알림창의 스타일을 사용자 정의하고, 버튼과 타이틀을 쉽게 추가할 수 있습니다.

PMAlertController 설치

PMAlertController를 사용하기 위해 먼저 CocoaPods를 사용하여 프로젝트에 설치해야 합니다. Podfile에 다음과 같이 추가합니다.

pod 'PMAlertController'

그런 다음 터미널에서 다음 명령을 실행하여 CocoaPods를 업데이트합니다.

pod install

스캔 기능 추가하기

스캔 기능을 PMAlertController에 추가하기 위해서는 코드에 바코드 스캐너 라이브러리를 추가해야 합니다. 대표적인 바코드 스캐너 라이브러리인 AVFoundation을 사용하겠습니다.

import UIKit
import AVFoundation

class ViewController: UIViewController {

    var captureSession: AVCaptureSession?
    var videoPreviewLayer: AVCaptureVideoPreviewLayer?
    var qrCodeFrameView: UIView?
    
    // 스캔된 바코드의 결과값을 표시하는 레이블
    @IBOutlet var scannedLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 카메라를 사용할 수 있는지 확인
        guard let captureDevice = AVCaptureDevice.default(for: .video) else {
            print("카메라에 접근할 수 없습니다.")
            return
        }
        
        do {
            // 캡처 세션을 생성
            captureSession = AVCaptureSession()
            
            // 캡처 디바이스를 사용하여 input 생성
            let input = try AVCaptureDeviceInput(device: captureDevice)
            
            // 캡처 세션에 input 추가
            captureSession?.addInput(input)
            
            // 비디오 출력을 설정하여 캡처 세션에 추가
            let captureMetadataOutput = AVCaptureMetadataOutput()
            captureSession?.addOutput(captureMetadataOutput)
            
            // 메타 데이터 출력에 딜리게이트 지정
            captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
            captureMetadataOutput.metadataObjectTypes = [.qr, .ean13, .ean8, .code128]
            
            // 비디오를 미리보기하는 레이어 생성
            videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
            videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
            videoPreviewLayer?.frame = view.layer.bounds
            view.layer.addSublayer(videoPreviewLayer!)
            
            // 캡처 시작
            captureSession?.startRunning()
            
            // 바코드를 감지하는 뷰 생성
            qrCodeFrameView = UIView()
            if let qrCodeFrameView = qrCodeFrameView {
                qrCodeFrameView.layer.borderColor = UIColor.green.cgColor
                qrCodeFrameView.layer.borderWidth = 2
                view.addSubview(qrCodeFrameView)
                view.bringSubview(toFront: qrCodeFrameView)
            }
            
        } catch {
            print("캡처 세션 생성에 실패했습니다.")
        }
        
    }
    
    // 바코드가 감지되었을 때 호출됨
    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
        // 바코드가 감지되지 않으면 qrCodeFrameView를 숨김
        if metadataObjects == nil || metadataObjects.count == 0 {
            qrCodeFrameView?.frame = CGRect.zero
            return
        }
        
        // 바코드를 감지한 경우
        let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
        if let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj) {
            qrCodeFrameView?.frame = barCodeObject.bounds
        }
        
        // 스캔된 바코드의 결과값 표시
        if let metaDataString = metadataObj.stringValue {
            scannedLabel.text = metaDataString
        }
    }

}

위의 코드는 ViewController에서 바코드를 스캔하고 결과값을 표시하는 간단한 예제입니다. 이 코드를 적절한 위치에 추가하고, 바코드 스캔이 필요한 위치에서 PMAlertController를 호출하면 스캔 기능이 포함된 알림창을 사용할 수 있습니다.

PMAlertController에 스캔 기능을 추가하는 방법에 대해 알아보았습니다. 편리한 알림창 구현을 위해 PMAlertController를 사용해보세요!

참고: