Begrijpen AVFoundation voor Barcode en QR Code scannen

Apple . AVFoundation framework biedt een full-featured, low-level interface voor het werken met audiovisuele media op iOS-apparaten. Voor barcode en QR code scanning, het kader bloott de klasse, die een breed scala van machineleesbare codes in real time kan detecteren uit de camera-feed. Dit omvat QR codes, EAN-8/13, Code 128, PDF417, Aztec, en vele andere formaten. Het kader behandelt het zware tillen van beeldanalyse en code decodering, zodat ontwikkelaars zich kunnen concentreren op toepassing logica in plaats van het implementeren van aangepaste scanning algoritmes.

AVFoundation scanning is hardware-versneld op moderne apparaten, biedt snelle en betrouwbare detectie, zelfs in uitdagende lichtomstandigheden. Het werkt met zowel voor- als achtercamera's, en het detectiegebied kan worden beperkt tot een specifieke regio van belang om de prestaties en de gebruikerservaring te verbeteren.

De camera-opnamesessie instellen

De kern van een AVFoundation-gebaseerde scanner is de . Dit object orkestreert de datastroom van de camera-invoer naar de metadata-uitvoer. Het instellen van de sessie vereist verschillende boilerplate stappen, die het best in een specifieke view controller of managerklasse kunnen worden geïmplementeerd.

Camera-machtiging aanvragen

Voordat u de camera opent, moet u om toestemming vragen. Vanaf iOS 10 moet u de sleutel opnemen in uw Info.plist-bestand met een string die uitlegt waarom uw app de camera nodig heeft. Toestemming wordt gevraagd met . Handvat beide gevallen .. verleend en geweigerd ..en update uw UI dienovereenkomstig.

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

De AVCaptureSession aanmaken

Zodra toestemming is verleend, instanteert een . Configureer de sessievoorinstelling om de videokwaliteit te controleren; voor barcodescanning is een goede standaard, maar je kunt ook gebruiken voor snellere verwerking.

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

Camera-invoer toevoegen

Verkrijg het standaard videoapparaat (de achtercamera) en maak een ]. Als de invoer niet aan de sessie kan worden toegevoegd (bijvoorbeeld het apparaat is bezet), vang de fout op en geef feedback aan de gebruiker.

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

De metadata-uitvoer toevoegen

Maak een instantie, stel de gedelegeerde in (op een speciale serierij), en voeg het toe aan de sessie. De gedelegeerde ontvangt gedetecteerde metadata-objecten.

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]

Voorwaarde: moet ingesteld worden nadat de uitvoer aan de sessie is toegevoegd. Eerder instellen zal een crash veroorzaken.

Sessie starten

Voer de sessie uit op een achtergrondthread om de UI responsief te houden. Bel in een achtergrondverzendingswachtrij of in een speciale seriële wachtrij.

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

Uitvoering van de gedelegeerde methode

De gedelegeerde methode wordt aangeroepen wanneer de scanner één of meer codes detecteert. Deze methode ontvangt een reeks van gevallen, die je moet casten naar om toegang te krijgen tot de gedecodeerde string.

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

Het is gebruikelijk om de sessie te stoppen na een succesvolle scan om herhaalde detecties te voorkomen. Bel na het verwerken van de code, en herstart het wanneer de gebruiker de scanner opnieuw instelt.

Gedetecteerde codes verwerken

Zodra u de string waarde, bepalen welke actie te nemen op basis van het code type en de inhoud. Gemeenschappelijke scenario's omvatten:

  • URLs
  • Wi-Fi-gegevens . . Ontleden van het standaardformaat () en programmatisch verbinden (eis extra recht nodig).
  • Productcodes
  • Contactinformatie . . Parse vCard of MeCard formaten en maak een nieuw contact in het adresboek.
  • Plain tekst

Voor elk codetype, valideer de string voordat u deze verwerkt. Misvormde of kwaadaardige codes moeten worden genegeerd of elegant gerapporteerd.

Beste praktijken voor het scannen van prestaties

Om een soepel en efficiënt scannen te garanderen, volg deze richtlijnen:

  • Limiteer metadata objecttypes
  • Een gebied van belang instellen Gebruik om een klein deel van de videofeed te definiëren waar codes worden verwacht. Dit verbetert de detectiesnelheid drastisch en vermindert vals positief.
  • Gebruik de juiste videozwaartekracht
  • Een serieuze wachtrij voor gedelegeerde callbacks gebruiken
  • Bekijk de fakkelondersteuning .Verlaat de gebruiker de camera's aan te schakelen voor laaglichtscenario's. Controleer voordat u aan het schakelen bent.
  • Scannen herstellen na het verwerken

Gebruikersfeedback geven

Een goede scanervaring omvat visuele en auditieve signalen. Implementeer deze feedbackmechanismen om de gebruiker te begeleiden:

  • Visuele overlay
  • Animatie
  • Geluid
  • Haptische feedback
  • Scan gebied gids

Fout bij het afhandelen van en Rand-gevallen

Robuuste foutafhandeling zorgt ervoor dat uw scanner sierlijk degradeert wanneer er iets mis gaat.

  • Camera niet beschikbaar
  • Toestemming geweigerd
  • Sessieconfiguratiefout
  • Laag licht of wazige beelden . .Verminder het detectiegebied van belang en zorg ervoor dat de camera autofocus is ingeschakeld. Waarschuw de gebruiker om het licht te verhogen of het apparaat te stabiliseren.
  • Ongeldige of niet-ondersteunde codetypen

Testen van alle apparaten

AVFoundation barcode scannen de prestaties varieert aanzienlijk tussen de generaties van iPhone en iPad. Test uw implementatie op:

  • Oudere apparaten (iPhone 6s, iPad Air 2)
  • Apparaten met verschillende camera-optiek . iPhones met telefoto of ultra-brede camera's kunnen zich anders concentreren. Gebruik altijd de standaard groothoekcamera voor barcodescanning.
  • Laaglichtomgevingen . . Test in dimomstandigheden om te zorgen dat de scanoverlay zichtbaar blijft en de fakkel omschakelt.
  • Verschillende codematen en oriëntaties . . Probeer codes van 1 cm × 1 cm stickers tot grote posters, en test landschap vs. portret scannen.

Geavanceerde overwegingen

Voor productie-apps, overwegen toevoegen van functies zoals continu scannen (het toestaan van meerdere codes in een sessie), zoombesturingen, of integratie met ARKit voor augmented reality overlays. Als u codes van stil beelden (bijv. fotobibliotheek), gebruik of ] uit het Vision-raamwerk, hoewel AVFoundation is over het algemeen sneller voor real-time video.

Voor een diepere duik in AVFoundation configuratie, verwijzen naar Apple

Door deze richtlijnen te volgen en uw implementatie grondig te testen, kunt u een gepolijste, hoog presterende barcode- en QR-codescanner leveren die uw iOS-app bruikbaarder en betrouwbaarder maakt.