Table of Contents
Forstå AVFoundation for strekkode og QR-kodeskanning
Apples AVFoundation-rammeverk gir et fullt funksjonelt grensesnitt for å jobbe med audiovisuelle medier på iOS-enheter. For strekkode og QR-kodeskanning avgir rammeverket klassen, som kan oppdage et bredt spekter av maskinlesbare koder i sanntid fra kameraets feed. Dette inkluderer QR-koder, EAN-8/13, kode 128, PDF417, Aztec og mange andre formater. Rammeverket håndterer den tunge løftingen av bildeanalyse og kodedekoding, slik at utviklere kan fokusere på applikasjonslogikk i stedet for å implementere egendefinerte skanningsalgoritmer.
AVFoundation skanning er maskinvare ⁇ akcelerert på moderne enheter, tilbyr rask og pålitelig deteksjon selv i utfordrende belysningsforhold. Det fungerer med både front- og bakkameraer, og deteksjonsområdet kan begrenses til en bestemt region av interesse for å forbedre ytelse og brukeropplevelse.
Sette opp kameraet fangstøkt
Kjernen til en AVFoundation-basert skanner er . Dette objektet orkesterer datastrømmen fra kameraets inngang til metadatautgangen. Å sette opp sesjonen krever flere kjeleplatetrinn, som er best implementert i en dedikert visningskontrollator eller managerklasse.
Be om kameratillatelse
Før du får tilgang til kameraet, må du be om brukertillatelse. Starter i iOS 10, må du inkludere nøkkelen i Info.plist-filen din med en streng som forklarer hvorfor appen din trenger kameraet. Tillatelse er bedt om å bruke . Håndter begge tilfellene ⁇ gitt og nektet ⁇ og oppdatere UI-grensesnittet i samsvar med dette.
AVCaptureDevice.requestAccess(for: .video) { granted in
if granted {
// Configure and start the capture session
} else {
// Show an alert guiding the user to Settings
}
}
Opprette AVCaptureSession
Når det er gitt tillatelse, instantize an . Konfigurer dens øktinnstillinger til å kontrollere videokvaliteten; for strekkodeskanning, ] er en god standard, men du kan også bruke til raskere behandling.
let session = AVCaptureSession()
session.sessionPreset = .high
Legg til kamerainngang
Ta vare på standardvideoenheten (det bakre kameraet) og lag en . Hvis inngangen ikke kan legges til sesjonen (f.eks. enheten er opptatt), fange feilen og presentere tilbakemelding til brukeren.
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)")
}
Legg til metadatautdata
Opprett en instans, angi dens delegat (i en dedikert seriekø) og legg den til i sesjonen. Delegasjonen vil motta detekterte metadataobjekter.
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]
Viktig: må settes etter at utgangen er lagt til sesjonen. Å sette den tidligere vil forårsake en krasj.
Starter sesjonen
Kjør sesjonen på en bakgrunnstråd for å holde UI responsiv. Ring i en bakgrunnsavsendelseskø eller i en dedikert seriekø.
DispatchQueue.global(qos: .userInitiated).async {
session.startRunning()
}
Implementere delegatmetoden
Den delegerte metoden [[FLT: 16]] kalles når skanneren oppdager en eller flere koder. Denne metoden mottar en rekke [FLT: 17] forekomster, som du må kaste til [[FLT: 18] for å få tilgang til den dekodede strengen.
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)
}
Det er vanlig å stoppe sesjonen etter en vellykket skanning for å hindre gjentatte deteksjoner. Ring etter å ha håndtert koden, og start den på nytt når brukeren tilbakestiller skanneren.
Håndtering Oppdagede koder
Når du har strengverdien, bestemme hvilken handling du skal ta basert på kodetypen og innholdet. Vanlige scenarier inkluderer:
- URLs ⁇ Åpne i Safari eller en i-app-nettleser ved hjelp av .
- Wi ⁇ Fi-informasjon ⁇ Tolk standardformatet (]) og koble programmatisk (krever ytterligere rettighet).
- Produktkoder ⁇ Slå opp produktinformasjon via et API som UPC-databasen eller ditt eget lagersystem.
- Kontaktinformasjon ⁇ Tolk vCard- eller MeCard-formater og lag en ny kontakt i adresseboken.
- Plaintekst ⁇ Vis i en varsel eller kopier til pasteboard.
For hver kodetype bør du validere strengen før behandlingen. Feil eller skadelig kode bør ignoreres eller rapporteres med nåde.
Beste praksis for å skanne ytelse
For å sikre jevn og effektiv skanning, følg disse retningslinjene:
- Limit metadataobjekttyper ⁇ Bare aktiver kodeformatene appen din faktisk trenger. Hvert ekstra format legger til behandling overhead.
- Sett et område av interesse ⁇ Bruk til å definere en liten del av videotilførselen der det forventes kode. Dette forbedrer dramatisk deteksjonshastigheten og reduserer falske positive.
- Bruk riktig videogravitasjon] holder kameraets forhåndsvisning proporsjonal og er ideell for overlegging av skanning -område guider.
- Lever en seriekø for delegatangrep] ⁇ Utfør tung behandling (f.eks. nettverksoppslag) fra hovedtråden for å holde UI-respons.
- Consider faks støtte ⁇ La brukeren slå av kameraets faks for lavlysscenarier. Sjekk før du slår.
- Reset skanning etter håndtering] ⁇ Etter en vellykket skanning, start sesjonen på nytt med kort forsinkelse (f.eks. 1 ⁇ 2 sekunder) for å hindre umiddelbar gjenkjenning av den samme koden.
Gi brukerens tilbakemelding
En god skanneopplevelse inkluderer visuelle og auditive cues. Implementer disse tilbakemeldingsmekanismene for å veilede brukeren:
- Visualt overlegg ⁇ Tegn et høydepunkt rundt den detekterte koden ved hjelp av -egenskapen til . Dette krever konvertering av metadatakoordinater for å vise koordinater via .
- Animasjon ⁇ Spill en subtil animasjon (f.eks. en krympende grense) når en kode gjenkjennes.
- Sound] ⁇ Spill av et systemlyd ved hjelp av med en kort, positiv tone som («Mail Sent» lyden).
- Haptisk tilbakemelding] ⁇ Bruk eller ] for en subtil vibrasjon.
- Scan områdeveiledning ⁇ Vis et gjennomsiktig rektangel med hjørneguider for å hjelpe brukerne å sentre koden.
Feilhåndtering og kantsaker
Robust feilhåndtering sikrer skanneren din nedgraderer graciøst når ting går galt.
- Camera utilgjengelig ⁇ Sjekk og på enheten. På iPod touch eller simulator uten kamera, presenterer en meningsfull melding.
- ]Vis en varsel med en knapp som åpner innstillinger via .
- Service-konfigurasjonsfeil ⁇ Loggfeil når eller returnerer . Dette kan skje hvis en annen app bruker kameraet i bakgrunnen (sjelden).
- Lågt lys eller uklare bilder ⁇ Reduser deteksjonsregionen av interesse og sikre at kameraet autofokus er aktivert. Spør brukeren om å øke lyset eller stabilisere enheten.
- Ugyldige eller ikke-støtte kodetyper ⁇ egenskapen støtter kanskje ikke alle formater på alle enheter. Bruk til å spørre om kompatibilitet før innstilling.
Testing av overordnet enheter
AVFoundation streckcode skanne ytelse varierer betydelig i generasjoner av iPhone og iPad. Test implementeringen på:
- Eldre enheter (iPhone 6s, iPad Air 2) ⁇ Disse har langsommere prosessorer og kan slite med høyoppløselige forhåndsinnstillinger. Bruk for optimal balanse på eldre maskinvare.
- Enheter med forskjellig kameraoptik ⁇ iPhones med telefoto eller ultra-vidde kameraer kan fokusere annerledes. Bruk alltid standard bredvinkelkameraet for strekkodeskanning.
- Lavlysmiljøer ⁇ Test under svake forhold for å sikre at skanningen forblir synlig og fakkelen fungerer.
- Forskjellige kodestørrelser og orienteringer ⁇ Prøv koder fra 1 cm × 1 cm klistremerker til store plakater, og test landskap vs portrettskanning.
Avanserte vurderinger
For produksjonsapper, vurdere å legge til funksjoner som kontinuerlig skanning (tillater flere koder i én sesjon), zoom kontroller eller integrasjon med ARKit for utvidede virkelighet overlegg. Hvis du trenger å behandle koder fra stille bilder (f.eks. fotobibliotek), bruk eller fra Visjon rammeverket, selv om AVFoundation generelt er raskere for sanntidsvideo.
For et dypere dykk i AVFoundation-konfigurasjonen, se Apples ]Set opp en Capture Session guide og AVCaptureMetadataOutput-dokumentasjon]. Du kan også finne et komplett prøveprosjekt i Scanning Strekkoder med AVCaptureMetadataOutput artikkel.
Ved å følge disse retningslinjene og grundig teste implementeringen din, kan du levere en polert, høyytelsesstreckkode og QR-kodeskanner som forbedrer din iOS-apps brukbarhet og pålitelighet.