Mätning och instrumentering
Utveckla en streckkod och Qr Code Scanner i Ios med Avfoundation
Table of Contents
Förstå AVFoundation för streckkod och QR-kodskanning
Apples AVFoundation-ram ger ett fullfjädrat, lågt nivågränssnitt för att arbeta med audiovisuella medier på iOS-enheter. För streckkods- och QR-kodskanning exponerar ramen ]-klassen, som kan upptäcka ett brett spektrum av maskinläsbara koder i realtid från kameraflödet. Detta inkluderar QR-koder, EAN-8/13, Code 128, PDF417, Aztec och många andra format.
AVFoundation-skanning är hårdvaruaccelererad på moderna enheter, som erbjuder snabb och tillförlitlig detektion även i utmanande belysningsförhållanden. Det fungerar med både fram- och bakre kameror, och detekteringsområdet kan begränsas till en viss region av intresse för att förbättra prestanda och användarupplevelse.
Ställa in kamera Capture Session
Kärnan i någon AVFoundation-baserad skanner är . Detta objekt iscensätter dataflödet från kamerainmatningen till metadatautgången. Ställ in sessionen kräver flera pannplatta steg, som bäst implementeras i en dedikerad vykontroll eller chefsklass.
Begär kameratillstånd
Innan du öppnar kameran måste du be om användartillstånd. Börjar i iOS 10 måste du inkludera ]-nyckeln i din Info.plist-fil med en sträng som förklarar varför din app behöver kameran. Tillstånd begärs med ]. Hantera båda fallen - beviljas och nekas - och uppdatera ditt UI i enlighet därmed.
AVCaptureDevice.requestAccess(for: .video) { granted in
if granted {
// Configure and start the capture session
} else {
// Show an alert guiding the user to Settings
}
}
Skapa AVCaptureSession
När tillstånd beviljas, omedelbar en ]. Konfigurera sin session förinställd för att styra videokvaliteten; för streckkodsskanning är ett bra standard, men du kan också använda ] för snabbare behandling.
let session = AVCaptureSession()
session.sessionPreset = .high
Lägga till kamerainput
Skaffa standardvideoenheten (den bakre kameran) och skapa en . Om ingången inte kan läggas till i sessionen (t.ex. är enheten upptagen), fånga felet och presentera feedback till användaren.
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)")
}
Lägga till Metadata Output
Skapa en ] instans, sätt dess delegat (på en dedikerad seriekö) och lägg till den i sessionen. Delegaten kommer att få upptäckta metadataobjekt.
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]
Viktigt: ] måste ställas in efter att utgången läggs till i sessionen. Inställningen av den tidigare kommer att orsaka en krasch.
Starta sessionen
Kör sessionen på en bakgrundstråd för att hålla UI responsiv. Call ] i en bakgrundsavsändningskö eller på en dedikerad seriekö.
DispatchQueue.global(qos: .userInitiated).async {
session.startRunning()
}
Genomföra delegatmetoden
Delegatmetoden ] kallas när skannern upptäcker en eller flera koder. Denna metod får en rad ] instanser, som du måste kasta till för att komma åt den avkodade strängen.
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 är vanligt att stoppa sessionen efter en framgångsrik skanning för att förhindra upprepade upptäckter. Call efter hantering av koden och starta om den när användaren återställer skannern.
Hantering av upptäckta koder
När du har strängvärdet, bestämma vilken åtgärd som ska vidtas baserat på kodtyp och innehåll. Vanliga scenarier inkluderar:
- [] - Öppna i Safari eller en webbläsare med ]].
- ]Wi-Fi-uppgifter - Fördjupa standardformatet () och ansluta programmatiskt (kräver ytterligare rätt).
- ] Produktkoder [] - Leta upp produktinformation via ett API som ]] UPC Database ] eller ditt eget lagersystem.
- ]Kontaktinformation - Parse vCard eller MeCard-format och skapa en ny kontakt i adressboken.
- ]Sätt text - Visa i en varning eller kopiera till pasteboard.
För varje kodtyp, validera strängen före bearbetning. Malformerade eller skadliga koder bör ignoreras eller rapporteras graciöst.
Bästa praxis för Scanning Performance
För att säkerställa en smidig och effektiv skanning, följ dessa riktlinjer:
- ]]Limit metadataobjekttyper[] - Gör bara det möjligt för kodformat som din app faktiskt behöver. Varje extra format lägger till bearbetning över huvudet.
- ] Ställ in en intresseregion[ - Använd ] för att definiera en liten del av videoflödet där koder förväntas. Detta förbättrar dramatiskt detekteringshastigheten och minskar falska positiva.
- ] Använd rätt video gravitation - ]]] håller kameran förhandsgranskning proportionell och är idealisk för överlagring av skanningsområdesguider.
- ]Leverage a serial queue for delegate callbacks - Utför tung bearbetning (t.ex. nätverkssups) av huvudtråden för att hålla UI responsive.
- ] Tänk på facklansupport - Låt användaren växla kamerans fackla för lågljusscenarier. Kontrollera innan du växlar.
- Återställ skanning efter hantering - Efter en lyckad skanning startar sessionen med en kort fördröjning (t.ex. 1-2 sekunder) för att förhindra omedelbar omdetektering av samma kod.
Tillhandahålla användarfeedback
En bra skanningsupplevelse inkluderar visuella och auditiva signaler. Genomföra dessa återkopplingsmekanismer för att styra användaren:
- Visuell överlagring[ - Rita en rektangel runt den upptäckta koden med ] egendom ]]. Detta kräver att omvandla metadata koordinater för att se koordinater via ].
- ]Animation – Spela en subtil animation (t.ex. en krympande gräns) när en kod erkänns.
- ]Sound - Spela ett systemljud med med en kort, positiv ton som ] ("Mail Sent" ljud).
- ]Haptisk återkoppling[ - Använd ] eller ]] för en subtil vibration.
- Skana områdesguide - Visa en genomskinlig rektangel med hörnguider för att hjälpa användare att centrera koden.
Felhantering och Edge Cases
Robust felhantering säkerställer att din skanner försämras graciöst när saker går fel.
- ]]Camera otillgänglig - Kontrollera ] och ]] på enheten. På iPod touch eller simulator utan en kamera, presentera ett meningsfullt meddelande.
- ]Permission nekad[ - Visa en varning med en knapp som öppnar Inställningar via ].
- ]Session konfigurationssvikt - Log fel när ] eller ]] returnerar ]]. Detta kan hända om en annan app använder kameran i bakgrunden (sällsyn).
- Lågt ljus eller suddig bilder - Minska upptäcktsregionen av intresse och se till att kameran autofokus är aktiverad. Försök användaren att öka ljuset eller stabilisera enheten.
- ogiltig eller ostödd kodtyp - ] egendomen får inte stödja alla format på alla enheter. Använd för att fråga kompatibilitet innan du ställer in.
Testa över enheter
AVFoundation streckkodskanning prestanda varierar signifikant över generationer av iPhone och iPad. Testa ditt genomförande på:
- Äldre enheter (iPhone 6s, iPad Air 2) - Dessa har långsammare processorer och kan kämpa med högupplösta förinställningar. Använd ] för optimal balans på äldre hårdvara.
- Enheter med olika kameraoptik - iPhones med telefoto eller ultra-wide kameror kan fokusera annorlunda. Använd alltid standarden vidvinkelkamera för streckkodsskanning.
- Lågljusmiljöer - Test i dimförhållanden för att säkerställa skanningsöverlagret förblir synligt och facklansen fungerar.
- Olika kodstorlekar och orienteringar - Prova koder från 1 cm × 1 cm klistermärken till stora affischer och testa landskapet vs. porträttskanning.
Avancerade överväganden
För produktionsappar, överväga att lägga till funktioner som kontinuerlig scanning (tillåter flera koder i en session), zoom kontroller, eller integration med ARKit för förstärkta verkligheten överlagor. Om du behöver bearbeta koder från stillbilder (t.ex. fotobibliotek), använd eller ]]]] från Vision ramen, även om AVFoundation är i allmänhet snabbare för realtid video.
För en djupare dyk i AVFoundation konfiguration, hänvisa till Apples Ställ in en Capture Session ] guide och ]]]AVCaptureMetadataOutput dokumentation ]]]. Du kan också hitta ett komplett provprojekt i Skanning av streckkoder med AVCaptureMetadataOutput artikel.
Genom att följa dessa riktlinjer och noggrant testa ditt genomförande kan du leverera en polerad, högpresterande streckkod och QR-kodskanner som förbättrar din iOS-appens användbarhet och tillförlitlighet.