Înțelegerea FAINDIEREA AV pentru codul de bare și scanarea codului QR

Apples AVFoundation cadru oferă o interfață completă, la nivel scăzut pentru lucrul cu mass-media audiovizuale pe dispozitive iOS. Pentru scanarea codului de bare și QR, cadrul expune clasa , care poate detecta o gamă largă de coduri de citire a mașinilor în timp real de la feed-ul camerei. Aceasta include coduri QR, EAN-8/13, Cod 128, PDF417, Aztec, și multe alte formate. Cadrul se ocupă de ridicarea grea a analizei imaginii și decodarea codului, permițând dezvoltatorilor să se concentreze pe logica aplicație, în loc de implementarea algoritmilor personalizați de scanare.

Scanarea AVFoundation este hardware-accelerat pe dispozitive moderne, oferind o detectare rapida si fiabilă chiar și în condiții de iluminare provocatoare. Acesta funcționează atât cu camere de luat vederi din față și spate, iar zona de detectare poate fi limitată la o anumită regiune de interes pentru a îmbunătăți performanța și experiența utilizatorilor.

Configurarea sesiunii de capturare a camerei

Miezul oricărui scaner bazat pe AVFoundation este . Acest obiect orchestrează fluxul de date de la intrarea camerei la ieșirea metadatelor. Setarea sesiunii necesită mai multe trepte de cazane, care sunt cel mai bine implementate într-un controler de vizualizare dedicat sau clasa manager.

Cerem permisiunea camerei

Înainte de a accesa camera, trebuie să solicitați permisiunea utilizatorului. Începând cu iOS 10, trebuie să includeți tasta din fișierul Info.plust cu un șir explicând de ce aplicația dumneavoastră are nevoie de aparat de fotografiat. Permisiunea este solicitată folosind . Manipulați ambele cazuri . acordat și refuzat . și actualizați UI-ul în consecință.

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

Crearea de SESSION AVCapture

Odată ce se acordă permisiunea, instanțiați un . Configurați presetul sesiunii pentru a controla calitatea video; pentru scanarea codului de bare, ] este un bun implicit, dar puteți utiliza, de asemenea, pentru procesare mai rapidă.

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

Adăugarea de intrare aparat de fotografiat

Obțineți dispozitivul video implicit (camera din spate) și creați un . Dacă intrarea nu poate fi adăugată la sesiune (de exemplu, dispozitivul este ocupat), prindeți eroarea și prezentați feedback utilizatorului.

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

Adăugarea ieșirii de metadate

Creați o instanță , fixați-i delegatul (pe o coadă de serie dedicată) și adăugați-l la sesiune. Delegatul va primi obiecte de metadate detectate.

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]

Important: trebuie setat după adăugarea producției la sesiune. Setarea ei mai devreme va provoca un accident.

Începutul sesiunii

Rulați sesiunea pe un fir de fundal pentru a menține UI receptiv. Apel într-o coadă de expediere de fundal sau pe o coadă de serie dedicată.

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

Punerea în aplicare a metodei delegate

Metoda delegat este numită ori de câte ori scanerul detectează unul sau mai multe coduri. Această metodă primește o serie de de cazuri, pe care trebuie să le distribui pentru a accesa șirul decodat.

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

Este comun să se oprească sesiunea după o scanare de succes pentru a preveni detectarea repetată. Apel după manipularea codului, și reporniți-l atunci când utilizatorul resetează scanerul.

Manipularea codurilor detectate

Odată ce aveți valoarea string, determinați ce acțiune să ia pe baza tipului de cod și a conținutului. Scenariile comune includ:

  • URLS
  • Acreditari Wi-Fi
  • Codurile de produs
  • Contact information
  • Text de plată

Pentru fiecare tip de cod, validați șirul înainte de prelucrare. Codurile malformate sau malformate trebuie ignorate sau raportate cu grație.

Cele mai bune practici pentru performanţa de scanare

Pentru a asigura o scanare lină și eficientă, urmați următoarele orientări:

  • Tipuri de obiecte de metadate Limit
  • Setați o regiune de interes
  • Folosiţi gravitaţia video corectă ] ] păstrează previzualizarea camerei proporţională şi este ideală pentru suprapunerea ghidurilor de scanare-zonă.
  • Lăsați o coadă de serie pentru apelurile de delegat
  • Suport lanterna de conserva
  • Resetați scanarea după manipulare

Oferirea de feedback utilizatorului

O bună experiență de scanare include indicii vizuale și auditive. Implementați aceste mecanisme de feedback pentru a ghida utilizatorul:

  • Overlay vizual
  • Animație
  • Sound
  • Reacție rapidă
  • Scan area guide

Eroare la manevrare și la îndepărtarea cazurilor

Manipularea unei erori robuste asigură că scanerul se degradează graţios atunci când lucrurile merg prost.

  • Camera nu este disponibilă
  • Permisiune respinsă
  • Defecțiunea de configurare a sistemului [
  • Imagini luminoase sau neclare
  • Tipuri de coduri invalide sau nesusţinute

Încercarea dispozitivelor de protecție

Performanțele de scanare a codului de bare AVFoundation variază semnificativ de-a lungul generațiilor de iPhone și iPad. Testați-vă implementarea pe:

  • Dispozitive mai vechi (iPhone 6s, iPad Air 2)
  • Dispozitive cu diferite camere optice
  • Medii cu lumină joasă
  • Dimensiuni diferite de cod si orientări

Considerații avansate

Pentru aplicații de producție, ia în considerare adăugarea unor caracteristici precum scanarea continuă (permiţând mai multe coduri într-o singură sesiune), zoom control, sau integrarea cu ARKit pentru suprapusele augmentate ale realității. Dacă trebuie să procesați coduri din imagini nemișcate (de exemplu, biblioteca foto), folosiți sau din cadrul Viziunii, deși AVFoundation este în general mai rapid pentru videoclipul în timp real.

Pentru o scufundare mai profundă în configurația AVFoundation, consultați Apple Configurarea unei sesiuni de captură[] și ghidul AVCaptureMetadataExput documentation. Puteți găsi, de asemenea, un proiect complet de eșantionare în Scanarea codurilor de bare cu AVCaptureMetadataOutput.

Prin urma aceste orientări și testarea completă a implementării dumneavoastră, puteți oferi un cod de bare lustruit, de înaltă performanță și scaner de cod QR care îmbunătățește utilizarea și fiabilitatea aplicației iOS.