Comprensión de la AVFoundation para el código de barras y el escaneamiento de código QR

El marco de AVFoundation de Apple proporciona una interfaz de bajo nivel y de gran capacidad para trabajar con medios audiovisuales en dispositivos iOS. Para el análisis de códigos de códigos de códigos de códigos de códigos y QR, el marco expone la clase , que puede detectar una amplia gama de códigos legibles por máquina en tiempo real desde el feed de cámara. Esto incluye código EAN-8/13, Código 128, PDF417, lógica de aplicación de aplicaciones de aplicaciones de aplicaciones de aplicaciones de aplicaciones de aplicaciones de aplicaciones de aplicaciones de aplicaciones de aplicaciones de procesamiento y otros algoritmos

El escaneo de AVFoundation es acelerado por hardware en dispositivos modernos, ofreciendo una detección rápida y fiable incluso en condiciones de iluminación difíciles. Funciona con cámaras frontales y traseras, y el área de detección puede ser limitada a una región de interés específica para mejorar el rendimiento y la experiencia del usuario.

Configuración de la sesión de captura de la cámara

El núcleo de cualquier escáner AVFoundation-based es el . Este objeto orquesta el flujo de datos desde la entrada de la cámara a la salida de metadatos. La configuración de la sesión requiere varios pasos de caldera, que se implementan mejor en una clase de controlador de visión dedicada o de gerente.

Solicitud de autorización de cámara

Antes de acceder a la cámara, debe solicitar permiso de usuario. A partir de iOS 10, debe incluir la tecla en su archivo Info.plist con una cadena explicando por qué su aplicación necesita la cámara. Se solicita permiso utilizando . Maneja ambos casos – concedido y negado – y actualiza su interfaz de usuario en consecuencia.

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

Creación de la Sesión AVCapture

Una vez que se concede el permiso, instantiate an . Configure su preset de sesión para controlar la calidad del vídeo; para el análisis de códigos de barras, es un buen defecto, pero también puede utilizar para un procesamiento más rápido.

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

Añadiendo la entrada de la cámara

Obtenga el dispositivo de vídeo predeterminado (la cámara trasera) y cree un . Si la entrada no puede ser agregada a la sesión (por ejemplo, el dispositivo está ocupado), coge el error y presente la retroalimentación al usuario.

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)")
}

Añadiendo el producto de metadatos

Crear un instancia, establecer su delegado (en una cola de serie dedicada), y añadirlo a la sesión. El delegado recibirá objetos de metadatos detectados.

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]

Importante: ] debe establecerse después de que la salida se añada a la sesión. La configuración anterior causará un accidente.

Inicio de la sesión

Ejecute la sesión en un hilo de fondo para mantener la interfaz de usuario receptiva. Llame en una cola de despacho de fondo o en una cola de serie dedicada.

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

Aplicación del método de delegados

El método delegado se llama cuando el escáner detecta uno o más códigos. Este método recibe una serie de instancias , a las que usted necesita para lanzar a para acceder a la cadena decodificada.

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)
}

Es común detener la sesión después de un exitoso escaneo para evitar las detecciones repetidas. Llame después de manejar el código, y reinicie cuando el usuario reajuste el escáner.

Manejo de códigos detectados

Una vez que tenga el valor de cadena, determinar qué acción tomar basado en el tipo de código y el contenido.

  • URLs – Abrir en Safari o en un navegador de aplicación usando .
  • ] credenciales de Wi-Fi – Parse el formato estándar (]) y conecte programáticamente (requiere un derecho adicional).
  • Códigos de producto] – Consultar información de los productos a través de una API como la base de datos de UPC o tu propio sistema de inventario.
  • Información de contacto] – Formatos Parse vCard o MeCard y crear un nuevo contacto en el libro de direcciones.
  • Texto de la palabra] – Visualizar en una alerta o copia para pegar.

Para cada tipo de código, valide la cadena antes de procesar. Los códigos malformados o maliciosos deben ser ignorados o reportados con gracia.

Las mejores prácticas para el rendimiento de exploración

Para asegurar un análisis suave y eficiente, siga estas directrices:

  • Tipos de objeto de metadatos de emisión – Sólo permite los formatos de código que tu app necesita. Cada formato adicional añade el procesamiento de sobrecabeza.
  • Establecer una región de interés] – Usar para definir una pequeña parte de la alimentación de vídeo donde se esperan códigos. Esto mejora dramáticamente la velocidad de detección y reduce falsos positivos.
  • Use la gravedad correcta del video – mantiene la cámara previsualizada proporcional y es ideal para sobreponer guías de área de exploración.
  • Promedio de una cola de serie para los callbacks delegados] – Realizar un procesamiento pesado (por ejemplo, búsquedas de red) fuera del hilo principal para mantener la interfaz de usuario sensible.
  • Consider torch support] – Permitir al usuario cambiar la antorcha de la cámara para escenarios de poca luz. Verificar antes de rebotar.
  • Reestablecer el escaneo después de la manipulación – Después de un escaneo exitoso, reiniciar la sesión con un breve retraso (por ejemplo, 1–2 segundos) para evitar la re-detección inmediata del mismo código.

Proporción de información de los usuarios

Una buena experiencia de exploración incluye cuestiones visuales y auditivas. Implementar estos mecanismos de retroalimentación para guiar al usuario:

  • Sobreposición visual] – Dibujar un rectángulo destacado alrededor del código detectado utilizando la propiedad de . Esto requiere convertir coordenadas de metadatos para ver coordenadas a través de .
  • Animación – Juega una animación sutil (por ejemplo, una frontera en contra) cuando se reconoce un código.
  • Sonido] – Juega un sonido del sistema usando con un tono corto y positivo como (el sonido "Mail Sent").
  • Retroalimentación óptica – Use o para una vibración sutil.
  • Guía de área de la zona de la isla] – Mostrar un rectángulo translúcido con guías de esquina para ayudar a los usuarios a centrar el código.

Casos de manipulación y borde de errores

El manejo de errores robusto garantiza que su escáner se degrada con gracia cuando las cosas van mal.

  • Camera no disponible] – Compruebe y ] en el dispositivo. En el iPod touch o simulador sin cámara, presente un mensaje significativo.
  • Permisión negado – Mostrar una alerta con un botón que abre Ajustes a través de .
  • ] Fallo de configuración de la sesión – Errores de registro cuando o devuelve . Esto puede suceder si otra aplicación está usando la cámara en el fondo (rare).
  • Utilizar imágenes de luz o borrosas] – Reducir la región de detección de interés y asegurar que la cámara esté habilitada para autofocar. Producir al usuario a aumentar la luz o mantener el dispositivo.
  • Tipos de código inválidos o no compatibles] – La propiedad no puede soportar todos los formatos en todos los dispositivos. Use para consultar la compatibilidad antes de establecer.

Pruebas a través de dispositivos

El rendimiento de la exploración de códigos de barras de AVFoundation varía significativamente a través de generaciones de iPhone y iPad.

  • Dispositivos más antiguos (iPhone 6s, iPad Air 2) – Estos tienen procesadores más lentos y pueden luchar con presets de alta resolución. Use para un equilibrio óptimo en hardware más antiguo.
  • Dispositivos con diferentes ópticas de cámara – Los iPhones con telefoto o cámaras ultra-ancha pueden enfocarse de forma diferente. Utilice siempre la cámara ancha predeterminada para escanear códigos de barras.
  • Entornos de bajo nivel – Prueba en condiciones de humedad para asegurar que el sobreimpresión de la exploración siga siendo visible y la revancha de la antorcha funciona.
  • Varios tamaños y orientaciones de código – Prueba códigos de 1 cm × 1 cm pegatinas a grandes carteles, y prueba paisaje vs. retrato escaneado.

Consideraciones avanzadas

Para aplicaciones de producción, considere agregar características como el escaneo continuo (que permite múltiples códigos en una sesión), controles de zoom o integración con ARKit para sobreimplantes de realidad aumentada. Si necesita procesar códigos de imágenes todavía (por ejemplo, biblioteca de fotos), use o del marco de Visión, aunque AVFoundation es generalmente más rápido para vídeo en tiempo real.

Para una mayor inmersión en la configuración de AVFoundation, consulte la guía de Apple ]Configuración de una sesión de captura y la AVCapturaMetadataDocumento de salida. También puede encontrar un proyecto de muestra completo en el

Siguiendo estas directrices y probando a fondo su implementación, puede ofrecer un código de barras pulido y de alto rendimiento y un escáner de código QR que mejora la usabilidad y fiabilidad de su aplicación iOS.