바코드 및 QR Code 스캔에 대한 AVFoundation 이해

Apple의 AVFoundation Framework는 iOS 기기에서 시청각 미디어와 작업하기 위해 전체 기능을 갖춘 저수준 인터페이스를 제공합니다. 바코드 및 QR 코드 스캔을 위해 프레임 워크는 카메라 피드에서 실시간 기계 학습 코드의 넓은 범위를 감지 할 수있는 [FLT :0] 클래스를 노출합니다. 이에는 QR 코드, EAN-8 / 13, Code 128, PDF417, Aztec 및 기타 여러 형식이 포함됩니다. 프레임 워크는 이미지 분석 및 사용자 정의 코딩보다 무거운 리프팅을 처리 할 수 있습니다.

AVFoundation 스캐닝은 현대 장치에, 제안 빠르고 믿을 수 있는 탐지를 도전적인 점화 상태에서 제안하는 기계설비입니다. 그것은 정면과 후방 사진기 둘 다와 작동하고, 탐지 지역은 성과와 사용자 경험을 개량하기 위하여 관심사의 특정한 지역에 제약될 수 있습니다.

Camera Capture Session 설정

AVFoundation ‐기반 스캐너의 핵심은 ]입니다. 이 객체는 메타데이터 출력에 카메라 입력에서 데이터 흐름을 조절합니다. 세션 설정은 여러 보일러 플레이트 단계가 필요합니다. 전용 보기 컨트롤러 또는 관리자 클래스에서 가장 잘 구현됩니다.

카메라 권한

카메라에 액세스하기 전에 사용자 권한을 요청해야합니다. iOS 10에서 시작하면 앱이 카메라를 필요로하는 문자열을 설명하는 Info.plist 파일에서 ]] 키를 포함해야합니다. 권한은 를 사용하여 요청됩니다. 두 경우 모두 부여 및 거부 - 및 UI를 업데이트하십시오.

AVCaptureDevice.requestAccess(for: .video) { granted in
 if granted {
 // Configure and start the capture session
 } else {
 // Show an alert guiding the user to Settings
 }
}

AVCaptureSession 만들기

일단 허가가 부여되면, ]를 즉시 구현합니다. 비디오 품질을 제어하기 위해 세션을 미리 설정하십시오. 바코드 스캐닝의 경우 ]는 좋은 기본이지만, 더 빠른 처리를위한 ]를 사용할 수 있습니다.

let session = AVCaptureSession()
session.sessionPreset = .high

카메라 입력 추가

기본 비디오 장치 (후방 카메라)를 얻고 ]를 만듭니다. 입력이 세션에 추가될 수 없는 경우(예를 들어, 장치는 바쁠), 오류를 잡아 사용자의 피드백을 제시합니다.

guard let camera = AVCaptureDevice.default(for: .video) else { return }
do {
 let input = try AVCaptureDeviceInput(device: camera)
 guard session.canAddInput(input) else { return }
 session.addInput(input)
} catch {
 print("Camera input error: \(error.localizedDescription)")
}

Metadata 산출 추가

] 인스턴스를 생성하고, delegate (전용 직렬 큐에)를 설정하고 세션에 추가합니다. delegate는 metadata 개체를 감지 할 것입니다.

let metadataOutput = AVCaptureMetadataOutput()
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
guard session.canAddOutput(metadataOutput) else { return }
session.addOutput(metadataOutput)

// Specify which code types to detect – must be done after the output is added
metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128, .pdf417]

중요: ]는 출력이 세션에 추가된 후 설정되어야 합니다. 초기 설정은 충돌을 일으킬 것입니다.

세션 시작

UI 응답을 유지하기 위해 배경 스레드에 세션을 실행. ]] 배경 파견 큐 또는 전용 직렬 큐에 호출.

DispatchQueue.global(qos: .userInitiated).async {
 session.startRunning()
}

Delegate 방법 구현

delegate 메서드 스캐너가 하나 이상의 코드를 감지 할 때마다 호출됩니다. 이 방법은 디딜 문자열에 액세스하려면 ] 인스턴스의 배열을받습니다.

func metadataOutput(_ output: AVCaptureMetadataOutput,
 didOutput metadataObjects: [AVMetadataObject],
 from connection: AVCaptureConnection) {
 // Process only the first detected code (most common pattern)
 guard let metadataObject = metadataObjects.first,
 let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject,
 let stringValue = readableObject.stringValue else { return }

 // Use the scanned value (e.g., display, validate, or send to server)
 handleScannedCode(stringValue, type: readableObject.type)
}

반복된 탐지를 방지하기 위해 성공적인 스캔 후 세션을 중지하는 것이 일반적입니다. 코드 처리 후 를 호출하고, 사용자가 스캐너를 재설정 할 때 다시 시작합니다.

취급 감지된 코드

문자열 값이 있으면 코드 유형과 내용에 따라 수행 할 작업이 결정됩니다. 일반적인 시나리오는 다음과 같습니다.

  • URLs - Safari에서 열기 또는 ]를 사용하여 인앱 브라우저.
  • Wi-Fi 자격] – 표준 형식을 파기() 및 프로그래밍을 연결(추가 항목이 필요).
  • 제품코드UPC Database] 또는 자신의 재고 시스템 등 API를 통해 제품정보를 찾습니다.
  • 문의 – Parse vCard 또는 MeCard 형식과 주소록의 새로운 연락처를 작성합니다.
  • Plain text – alert 또는 Copy to pasteboard에 표시한다.

각 코드 유형의 경우 처리하기 전에 문자열을 검증합니다. 변형되거나 악의적인 코드는 무시하거나 우아하게보고해야합니다.

Scanning Performance에 대한 모범 사례

원활하고 효율적인 스캔을 보장하려면이 지침을 따르십시오.

  • Limit metadata object type] – 코드 형식을 실제로 필요로 하는 경우에만 가능. 모든 추가 형식은 오버 헤드 처리 추가.
  • ]이 관심의 지역을 설정] – ]] 코드를 예상되는 비디오 피드의 작은 부분을 정의하기 위해. 이 극적으로 탐지 속도를 향상시키고 거짓 긍정적 인 효과를 감소.
  • 올바른 비디오 중력 - ] 카메라 미리보기 비율을 유지하고 오버레이 스캔 가이드에 이상적입니다.
  • ] delegate 콜백 – UI 응답을 유지하기 위해 메인 스레드에서 무거운 처리 (예를들면 네트워크 조회)를 수행.
  • Consider 토치 지원 – 저조도 시나리오에 대한 카메라의 토치를 토글할 수 있습니다. 를 toggling 전에 확인하십시오.
  • 처리 후 스캔을 재설정 – 성공적인 스캔 후, 짧은 지연으로 세션을 다시 시작(예: 1–2 초) 같은 코드의 즉각적인 재검출을 방지하기 위해.

사용자 피드백 제공

좋은 스캔 경험은 시각적 및 감사의 큐를 포함합니다. 사용자가 가이드하는 이러한 피드백 메커니즘을 구현하십시오.

  • Visual overlay – ]] 속성을 사용하여 검출된 코드 주위에 강조 표시된 크기를 그리기. 이것은 를 통해 좌표를 볼 수 메타 데이터 좌표를 변환해야합니다.
  • Animation – 코드가 인식될 때 미묘한 애니메이션(예: 수축 국경)을 재생합니다.
  • Sound – 짧은, 같은 긍정적인 음색 ] ("Mail Sent" sound)와 함께 시스템 사운드를 재생합니다.
  • Haptic feedback - ]] 또는 를 사용하여 미묘한 진동.
  • Scan area guide – 사용자가 코드를 중심하는 데 도움이 코너 가이드와 함께 반투명한 사각형을 표시합니다.

오류 처리 및 Edge 케이스

로버스트 오류 처리는 스캐너가 잘못되었을 때 분명히 향상됩니다.

  • 카메라는 사용할 수 없습니다 – ] 과 ] 장치에서. 카메라없이 iPod touch 또는 시뮬레이터에, 의미있는 메시지를 선물.
  • 출입금 – ]를 통해 설정된 버튼을 가진 경고를 표시합니다.
  • Session Configuration failure – ] 또는 ]]가 ]]를 반환할 때 로그 오류. 이 경우 다른 앱이 배경에 카메라를 사용하도록 발생할 수 있습니다 (레이어).
  • 낮은 빛 또는 흐릿한 이미지 – 관심의 탐지 영역을 감소시키고 카메라 자동 초점이 활성화되도록 합니다. 사용자가 빛을 증가하거나 장치를 꾸준한 증가시키기 위해.
  • 무효 또는 지원되지 않은 코드 유형 – ] 속성은 모든 장치에 모든 형식을 지원할 수 없습니다. 설정하기 전에 를 쿼리 호환성에 사용.

Across 장치 테스트

AVFoundation 바코드 스캐닝 성능은 iPhone 및 iPad의 발생을 크게 변화시킵니다. 구현을 테스트하십시오.

  • 이전 장치 (iPhone 6s, iPad Air 2) – 이 더 느리고 프로세서가 있고 고해상도 프리셋과 함께 투쟁할 수 있습니다. 를 사용하여 이전 하드웨어에서 최적의 균형을 유지하십시오.
  • 다른 카메라 광학 장치 – 텔레 포토 또는 울트라 ‐ 와이드 카메라와 아이폰은 다르게 초점을 맞출 수 있습니다. 항상 바코드 스캐닝을위한 기본 와이드 ‐ 각 카메라를 사용합니다.
  • Low-light 환경 – 스캔 오버레이가 눈에 띄는 것을 보장하기 위해 dim 조건에서 테스트하고 토치 토글 작품.
  • 다양한 코드 크기와 방향 – 큰 포스터에 1cm × 1cm 스티커에서 코드를 시도하고, 풍경 vs. 초상화 스캐닝을 테스트합니다.

고급 고려 사항

생산 앱을 위해서는 연속 스캔과 같은 기능을 추가해야 합니다(한 세션에서 여러 코드를 허용), 급상승 제어, 또는 증강 현실 오버레이를 위한 ARKit과 통합. 만약 당신이 여전히 이미지(예: 사진 라이브러리)에서 코드를 처리해야 하는 경우, 사용 ] 또는 ]] Vision Framework에서, AVFoundation는 일반적으로 실시간 비디오에 대한 빠른.

AVFoundation 구성으로 더 깊은 다이빙을 위해서는 Apple의 ]를 참조하여 Capture Session] 가이드와 ]AVCaptureMetadataOutput documentation를 설정합니다. 또한, ]에서 완전한 샘플 프로젝트를 찾을 수 있습니다. AVCaptureMetadataOutput] 문서를 스캔하는 바코드.

이 가이드라인을 따르고, 구현을 철저히 테스트하면, iOS 앱의 사용성 및 신뢰성을 향상시킨 연마, 고성능 바코드 및 QR 코드 스캐너를 제공 할 수 있습니다.