Messung und Instrumentierung
Entwicklung eines Barcode- und Qr-Code-Scanners in Ios mit Avfoundation
Table of Contents
Verständnis von AVFoundation für Barcode- und QR-Code-Scanning
Apples AVFoundation-Framework bietet eine voll ausgestattete, Low-Level-Schnittstelle für die Arbeit mit audiovisuellen Medien auf iOS-Geräten. Für Barcode- und QR-Code-Scanning stellt das Framework die -Klasse frei, die eine breite Palette von maschinenlesbaren Codes in Echtzeit aus dem Kamera-Feed erkennen kann. Dazu gehören QR-Codes, EAN-8/13, Code 128, PDF417, Aztec und viele andere Formate. Das Framework übernimmt das schwere Heben der Bildanalyse und Code-Dekodierung, so dass sich Entwickler auf die Anwendungslogik konzentrieren können, anstatt benutzerdefinierte Scanalgorithmen zu implementieren.
AVFoundation Scanning wird auf modernen Geräten hardwarebeschleunigt und bietet eine schnelle und zuverlässige Erkennung auch bei schwierigen Lichtverhältnissen. Es funktioniert sowohl mit Front- als auch mit Rückkameras, und der Erfassungsbereich kann auf eine bestimmte Region von Interesse beschränkt werden, um die Leistung und das Benutzererlebnis zu verbessern.
Einrichtung der Kameraerfassungssitzung
Kernstück eines jeden AVFoundation-basierten Scanners ist das , das den Datenfluss vom Kameraeingang zum Metadatenausgang orchestriert. Das Einrichten der Sitzung erfordert mehrere Boilerplate-Schritte, die am besten in einer dedizierten Ansichtssteuerung oder -managerklasse implementiert werden.
Anfordern der Kamera-Zulassung
Bevor Sie auf die Kamera zugreifen, müssen Sie um die Benutzerberechtigung bitten. Ab iOS 10 müssen Sie die Taste in Ihre Info.plist-Datei mit einer Zeichenfolge einfügen, die erklärt, warum Ihre App die Kamera benötigt. Die Erlaubnis wird mit angefordert. Behandeln Sie beide Fälle – gewährt und abgelehnt – und aktualisieren Sie Ihre Benutzeroberfläche entsprechend.
AVCaptureDevice.requestAccess(for: .video) { granted in
if granted {
// Configure and start the capture session
} else {
// Show an alert guiding the user to Settings
}
}
Erstellen der AVCaptureSession
Sobald die Berechtigung erteilt wurde, instanziieren Sie ein . Konfigurieren Sie die Sitzungsvoreinstellung, um die Videoqualität zu kontrollieren; für das Barcode-Scannen ist ein guter Standard, aber Sie können auch für eine schnellere Verarbeitung verwenden.
let session = AVCaptureSession()
session.sessionPreset = .high
Hinzufügen des Kameraeingangs
Besorgen Sie sich das Standard-Videogerät (die Rückkamera) und erstellen Sie ein Wenn die Eingabe nicht zur Sitzung hinzugefügt werden kann (z. B. ist das Gerät beschäftigt), fangen Sie den Fehler auf und geben Sie dem Benutzer Feedback.
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)")
}
Hinzufügen des Metadaten-Outputs
Erstellen Sie eine -Instanz, setzen Sie ihren Delegaten (in einer dedizierten seriellen Warteschlange) und fügen Sie ihn der Sitzung hinzu.
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]
Wichtig: muss gesetzt werden, nachdem die Ausgabe der Sitzung hinzugefügt wurde.
Beginn der Sitzung
Führen Sie die Sitzung in einem Hintergrund-Thread aus, um die Benutzeroberfläche reaktionsfähig zu halten.
DispatchQueue.global(qos: .userInitiated).async {
session.startRunning()
}
Umsetzung der delegierten Methode
Die Delegate-Methode wird aufgerufen, wenn der Scanner einen oder mehrere Codes erkennt. Diese Methode erhält ein Array von Instanzen, die Sie in umsetzen müssen, um auf die decodierte Zeichenfolge zuzugreifen.
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)
}
Es ist üblich, die Sitzung nach einem erfolgreichen Scan zu stoppen, um wiederholte Erkennungen zu verhindern, rufen Sie nach der Handhabung des Codes auf und starten Sie ihn neu, wenn der Benutzer den Scanner zurücksetzt.
Umgang mit erkannten Codes
Sobald Sie den Zeichenfolgenwert haben, bestimmen Sie, welche Aktion basierend auf dem Codetyp und dem Inhalt durchgeführt werden soll.
- URLs – Öffnen Sie in Safari oder einem In-App-Browser mit .
- Wi‐Fi-Anmeldeinformationen – Parse das Standardformat () und programmgesteuert verbinden (erfordert zusätzliche Berechtigung).
- Produktcodes – Suchen Sie Produktinformationen über eine API wie die UPC-Datenbank oder Ihr eigenes Inventarsystem nach.
- Kontaktinformationen – Parse vCard oder MeCard Formate und erstellen Sie einen neuen Kontakt im Adressbuch.
- Plain text – Anzeige in einer Warnung oder Kopie in der Einblendung.
Für jeden Codetyp ist die Zeichenfolge vor der Verarbeitung zu validieren.
Best Practices für Scanning Performance
Um ein reibungsloses und effizientes Scannen zu gewährleisten, befolgen Sie diese Richtlinien:
- Begrenzen Sie Metadaten-Objekttypen – Aktivieren Sie nur die Codeformate, die Ihre App tatsächlich benötigt. Jedes zusätzliche Format fügt Verarbeitungsaufwand hinzu.
- Setzen Sie eine Region von Interesse – Verwenden Sie , um einen kleinen Teil des Video-Feeds zu definieren, in dem Codes erwartet werden.
- Verwende die richtige Videogravitation – hält die Kameravorschau proportional und ist ideal für das Überlagern von Scan-Bereich-Guides.
- Nutze eine serielle Warteschlange für Delegate Callbacks – Führe eine starke Verarbeitung (z. B. Netzwerk-Lookups) außerhalb des Hauptthreads durch, um die Benutzeroberfläche reaktionsfähig zu halten.
- Betrachten Sie die Unterstützung des Brenners – Ermöglichen Sie dem Benutzer, die Taschenlampe der Kamera für Szenarien mit schlechten Lichtverhältnissen umzuschalten.
- Scannen nach der Handhabung zurücksetzen – Starten Sie die Sitzung nach einem erfolgreichen Scan mit einer kurzen Verzögerung (z. B. 1-2 Sekunden) neu, um eine sofortige Wiedererkennung desselben Codes zu verhindern.
Bereitstellung von Nutzerfeedback
Ein gutes Scan-Erlebnis umfasst visuelle und akustische Hinweise. Implementieren Sie diese Feedback-Mechanismen, um den Benutzer zu führen:
- Visual overlay – Zeichne ein Highlight-Rechteck um den erkannten Code mit der -Eigenschaft , wozu Metadatenkoordinaten konvertiert werden müssen, um Koordinaten über anzuzeigen.
- Animation – Spiele eine subtile Animation (z.B. einen schrumpfenden Rahmen), wenn ein Code erkannt wird.
- Sound – Spiele einen Systemsound mit mit einem kurzen, positiven Ton wie (dem “Mail Sent”-Sound).
- Haptisches Feedback – Benutze oder für eine subtile Vibration.
- Scan-Flächenführer – Zeigen Sie ein durchsichtiges Rechteck mit Eckanleitungen an, um den Benutzern zu helfen, den Code zu zentrieren.
Fehlerbehandlung und Edge Cases
Robuste Fehlerbehandlung stellt sicher, dass Ihr Scanner anmutig verschlechtert, wenn etwas schief geht.
- Kamera nicht verfügbar – Überprüfen Sie und auf dem Gerät.
- Permission denied – Zeigen Sie eine Warnung mit einer Schaltfläche, die Einstellungen über öffnet.
- Session Konfigurationsfehler – Protokollfehler, wenn oder zurückgibt. Dies kann passieren, wenn eine andere App die Kamera im Hintergrund verwendet (selten).
- Low light or blurry images – Reduzieren Sie den Erfassungsbereich, der von Interesse ist, und stellen Sie sicher, dass der Autofokus der Kamera aktiviert ist.
- Ungültige oder nicht unterstützte Codetypen – Die -Eigenschaft unterstützt möglicherweise nicht alle Formate auf allen Geräten.
Testen von geräteübergreifend
Die Barcode-Scan-Leistung von AVFoundation variiert erheblich zwischen den Generationen von iPhone und iPad.
- Ältere Geräte (iPhone 6s, iPad Air 2) – Diese haben langsamere Prozessoren und können mit hochauflösenden Presets zu kämpfen haben.
- Geräte mit unterschiedlicher Kameraoptik – iPhones mit Tele- oder Ultraweitkameras können unterschiedlich fokussieren. Verwenden Sie immer die Standard-Weitwinkelkamera für Barcode-Scans.
- Low-Light-Umgebungen – Testen Sie unter schwachen Bedingungen, um sicherzustellen, dass die Scan-Overlay sichtbar bleibt und der Fackelschalter funktioniert.
- Verschiedene Codegrößen und Orientierungen – Probieren Sie Codes von 1 cm × 1 cm Stickern bis hin zu großen Plakaten aus und testen Sie Landschafts- und Porträtscanning.
Fortgeschrittene Überlegungen
Für Produktions-Apps sollten Sie Funktionen wie kontinuierliches Scannen (mehrere Codes in einer Sitzung zulassen), Zoomsteuerungen oder die Integration mit ARKit für Augmented-Reality-Overlays hinzufügen. Wenn Sie Codes aus Standbildern (z. B. Fotobibliothek) verarbeiten müssen, verwenden Sie oder aus dem Vision-Framework, obwohl AVFoundation im Allgemeinen schneller für Echtzeit-Videos ist.
Für einen tieferen Einblick in die AVFoundation-Konfiguration siehe Apples Leitfaden zum Einrichten einer Capture Session und die Dokumentation zu AVCaptureMetadataOutput Sie finden auch ein vollständiges Beispielprojekt im Artikel Scannen von Barcodes mit AVCaptureMetadataOutput.
Indem Sie diese Richtlinien befolgen und Ihre Implementierung gründlich testen, können Sie einen polierten, leistungsstarken Barcode- und QR-Code-Scanner liefern, der die Benutzerfreundlichkeit und Zuverlässigkeit Ihrer iOS-App verbessert.