Comprendere AVFoundation per la scansione di codici a barre e codici QR

Il framework AVFoundation di Apple offre un'interfaccia a basso livello e completo per lavorare con i supporti audiovisivi sui dispositivi iOS. Per la scansione di codici a barre e QR code, il framework espone la classe , che può rilevare una vasta gamma di codici leggibili in tempo reale dall'algoritmo di elaborazione della fotocamera.

La scansione AVFoundation è accessibile su dispositivi moderni, offrendo un rilevamento rapido e affidabile anche in condizioni di illuminazione difficili, e funziona con telecamere anteriori e posteriori, e l'area di rilevamento può essere limitata a una specifica regione di interesse per migliorare le prestazioni e l'esperienza degli utenti.

Impostazione della sessione di cattura della fotocamera

Il nucleo di qualsiasi scanner basato su AVFoundation è il []. Questo oggetto orchestra il flusso di dati dall'ingresso della fotocamera all'uscita dei metadati.

Richiesta di autorizzazione della fotocamera

Prima di accedere alla fotocamera, è necessario chiedere il permesso dell'utente. A partire da iOS 10, è necessario includere il [ chiave nel file Info.plist con una stringa che spiega perché la tua applicazione ha bisogno della fotocamera. La permissione è richiesta utilizzando .

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

Creazione di AVCaptureSession

Configurare la sua sessione preimpostata per controllare la qualità video; per la scansione del codice a barre, ] è un buon default, ma è anche possibile utilizzare per un'elaborazione più rapida.

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

Aggiungere l'ingresso della fotocamera

Ottenere il dispositivo video predefinito (la fotocamera posteriore) e creare un [. Se l'ingresso non può essere aggiunto alla sessione (ad esempio, il dispositivo è occupato), prendere l'errore e presentare feedback all'utente.

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

Aggiungere l'uscita dei metadati

Creare un'istanza , impostare il suo delegato (su una coda seriale dedicata), e aggiungerla alla sessione.

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: deve essere impostato dopo che l'output viene aggiunto alla sessione.

Avvio della sessione

Eseguire la sessione su un thread di sfondo per mantenere l'interfaccia utente reattiva. Chiama [] in una coda di invio di sfondo o su una coda seriale dedicata.

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

Implementare il metodo del Delegato

Il metodo delegata è chiamato ogni volta che lo scanner rileva uno o più codici. Questo metodo riceve una serie di istanze , che è necessario lanciare a per accedere alla stringa decodificata.

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

È comune interrompere la sessione dopo una scansione di successo per evitare ripetute rilevazioni. Chiamare dopo aver gestito il codice e riavviarlo quando l'utente ripristina lo scanner.

Gestione dei codici rilevati

Una volta che hai il valore della stringa, determina quale azione prendere in base al tipo di codice e al contenuto.

  • URLs[] – Aprire in Safari o un browser in-app utilizzando .
  • Credenziali Wi‐Fi[[] – Parsare il formato standard ([) e collegare programmaticamente (richiede ulteriori diritti).
  • Codici di prodotto[] – Cerca informazioni sui prodotti tramite un'API come il [UPC Database[[] o il tuo sistema di inventario.
  • Informazioni relative al contatto[[] – Formati di Parse vCard o MeCard e crea un nuovo contatto nella rubrica.
  • Testo del foglio[[] – Mostra in un avviso o copia su pastboard.

Per ogni tipo di codice, convalidare la stringa prima dell'elaborazione. I codici malformati o maligni devono essere ignorati o segnalati con grazia.

Migliori Pratiche per la scansione delle prestazioni

Per garantire una scansione fluida ed efficiente, seguire queste linee guida:

  • Limit tipi di oggetti metadati[[[] – Attivare solo i formati di codice di cui l'app ha realmente bisogno.
  • Set una regione di interesse[[] – Usa [] per definire una piccola porzione del video feed dove ci si aspetta un codice, migliorando notevolmente la velocità di rilevamento e riducendo i falsi positivi.
  • Utilizzare la corretta gravità video[[] – [] mantiene proporzionale l'anteprima della fotocamera ed è ideale per sovrapporre le guide di area scan-laying.
  • Leva una coda seriale per i callback delegativi[[] – Eseguire l'elaborazione pesante (ad esempio, le ricerche di rete) dal thread principale per mantenere l'interfaccia utente reattiva.
  • Supporto torcia del contatto[[[[]] – Permette all'utente di attivare la torcia della fotocamera per scenari di scarsa illuminazione.
  • Ripristina la scansione dopo aver gestito[[[] – Dopo una scansione di successo, riavviare la sessione con un breve ritardo (ad esempio, 1–2 secondi) per evitare la ri-eliminazione immediata dello stesso codice.

Fornire Feedback utente

Una buona esperienza di scansione include spunti visivi e uditivi.Attuazione di questi meccanismi di feedback per guidare l'utente:

  • Sovrapposizione virtuale[[] – Disegnare un rettangolo di evidenziazione intorno al codice rilevato utilizzando la proprietà [ di ]. Ciò richiede la conversione delle coordinate dei metadati per visualizzare le coordinate .
  • Animation[] – Giocare un'animazione sottile (ad esempio, un confine restringente) quando un codice è riconosciuto.
  • Sound[] – Giocare un suono di sistema utilizzando [ con un tono breve e positivo come [] (il suono “Mail Sent”).
  • Rispondersi aptico[] – Usa o ] per una vibrazione sottile.
  • Guida area dello spazio[[] – Mostra un rettangolo traslucido con guide ad angolo per aiutare gli utenti a centrare il codice.

Gestione degli errori e dei casi di bordo

Robusto trattamento degli errori assicura che il vostro scanner si degrada con grazia quando le cose vanno male.

  • Camera non disponibile[[] – Controlla [ e ]] sul dispositivo. Su iPod touch o simulatore senza fotocamera, presentare un messaggio significativo.
  • Permesso negato[] – Mostra un avviso con un pulsante che apre Impostazioni tramite .
  • Errore di configurazione di sessione[[[]] – Errore di registro quando [[]] o [] restituisce []]. Questo può accadere se un'altra applicazione sta usando la fotocamera in background (rara).
  • Immagini a luce bassa o arrossita[[[] – Ridurre la regione di rilevamento di interesse e garantire che l'autofocus della fotocamera sia abilitato.
  • Tipi di codice non validi o non supportati[[] – La proprietà [ non può supportare tutti i formati su tutti i dispositivi.

Testare i dispositivi inversa

Le prestazioni di scansione del codice a barre AVFoundation variano in modo significativo attraverso le generazioni di iPhone e iPad.

  • Dispositivi più vecchi (iPhone 6s, iPad Air 2) – Questi hanno processori più lenti e possono lottare con preset ad alta risoluzione.
  • Dispositivi con ottica fotocamera diversa – iPhone con fotocamere tele o ultra-wide possono concentrarsi in modo diverso.
  • Ambienti a bassa luce – Test in condizioni di dim per garantire che la sovrapposizione di scansione rimanga visibile e la torcia di attivazione funziona.
  • Varie dimensioni e orientamenti di codice – Provare i codici da 1 cm × 1 cm adesivi per grandi poster, e il paesaggio di prova vs. scansione ritratto.

Considerazioni avanzate

Per le applicazioni di produzione, considerare l'aggiunta di funzionalità come la scansione continua (permettendo più codici in una sessione), il controllo dello zoom o l'integrazione con ARKit per sovrapposizioni di realtà aumentata. Se è necessario elaborare i codici da immagini ancora (ad esempio, libreria di foto), utilizzare o ] dal framework Vision, anche se AVFoundation è generalmente più veloce per il video in tempo reale.

Per un'immersione più profonda nella configurazione AVFoundation, fare riferimento a Apple ]Impostare una sessione di cattura[]]] guida e AVCaptureMetadataLa documentazione di uscita[]]. È inoltre possibile trovare un progetto completo nel Cascondi codici a barre con AVCaptureMetadata.

Seguendo queste linee guida e testando a fondo la tua implementazione, puoi fornire uno scanner di codici a barre lucido e QR code ad alte prestazioni che migliora l'usabilità e l'affidabilità dell'app iOS.